diff --git a/DEPS b/DEPS index 5182e09..059fbd67 100644 --- a/DEPS +++ b/DEPS
@@ -269,15 +269,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': '7425ab9c6d6c1849a063be3304f1287fe48774bd', + 'skia_revision': '6cd730f8f209f4c62d77f96076120ef6ae989090', # 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': '950dd03fc571095f2bd34622d0b89f3d829d4f00', + 'v8_revision': '5af8c6bf1de8c4e6ce73c11f2597348a21ec1c39', # 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': '34fb4f790b846c8514e969560f02043d69e8df77', + 'angle_revision': '14c483f1c497ff1bcc256bd5435cbf7af3d620cf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -344,7 +344,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '4cf9a8553fcbe12da54649fd7394ca95cb342096', + 'devtools_frontend_revision': '49ae10d02a40b48418788461bb50a19927f7b06a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -380,7 +380,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': '9483b741a884a1348611da58cd6b50b2d5e2b6fa', + 'dawn_revision': '03f361ba8ec0b5889ad57e9430c71a95fc9c68ed', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -428,7 +428,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': '393e3eee998d163753894939ab574dc57b08c7f3', + 'libunwind_revision': 'f1108b6ba347b4d22f6354c0e5eba3b6e4972ee1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1512,7 +1512,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f8b405298bd883ba95f7a14acfce230b37487ad3', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '69bc804a183b29d2eeaa9a61a589127db9228fe1', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1593,7 +1593,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/android/aemu/release/linux-amd64', - 'version': 'UHSf-UoP0syQ3LXuoTTsmaKA6vrklfVziW5v5jUo-h4C' + 'version': '6SFGBsjtmhvqT_71mNNNQyW5cLqv4kBw_lBU2BTOYNwC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1742,7 +1742,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ecf4804228d1473df8596c3c87e5b7e32649e2de', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '1cc01c3b18a7c170fc52765b35248201fce80be1', + Var('webrtc_git') + '/src.git' + '@' + '1bcd827e9b85e82ce13bd7cc27c5a4b90ba9c139', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1815,7 +1815,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@342b6e245243e006709f444dbc8e483456bec7e4', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@2b1e01b371b139a53fff0c367bac436ec0f995e9', 'condition': 'checkout_src_internal', }, @@ -1867,7 +1867,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'XEAuyJ6Pc1f3DJclaXRFbID9R83bA66lw3BGF9T0TJIC', + 'version': 'V9JzdCoenXL3b80a9rjxrfVDHevAwU7k5XFvVGe256AC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/WATCHLISTS b/WATCHLISTS index 3bf8380e..f4202d8 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -2769,7 +2769,8 @@ 'safe_browsing': ['drubery+watch@chromium.org', 'vakh+safe_browsing_watch@chromium.org', 'xinghuilu+watch@chromium.org'], - 'sampling_profiler': ['wittman+watch@chromium.org'], + 'sampling_profiler': ['wittman+watch@chromium.org', + 'chenleihu@google.com'], 'scanning': ['gavinwill+scanning-watch@chromium.org', 'zentaro+scanning-watch@chromium.org'], 'security': ['security-watchlist@chromium.org'],
diff --git a/ash/components/login/auth/BUILD.gn b/ash/components/login/auth/BUILD.gn index 3e5ac1cb..05d8e2b 100644 --- a/ash/components/login/auth/BUILD.gn +++ b/ash/components/login/auth/BUILD.gn
@@ -28,7 +28,6 @@ "//chromeos/metrics", "//components/account_id", "//components/device_event_log", - "//components/metrics", "//components/password_manager/core/browser:password_hash_data", "//components/prefs", "//components/user_manager",
diff --git a/ash/components/login/auth/DEPS b/ash/components/login/auth/DEPS index a14e5f7..bb4f5c5 100644 --- a/ash/components/login/auth/DEPS +++ b/ash/components/login/auth/DEPS
@@ -14,7 +14,6 @@ "+chromeos/login/login_state", "+components/account_id", "+components/device_event_log", - "+components/metrics", "+components/password_manager", "+components/prefs", "+components/user_manager",
diff --git a/ash/components/login/auth/login_performer.cc b/ash/components/login/auth/login_performer.cc index 084490a..4e81b1c 100644 --- a/ash/components/login/auth/login_performer.cc +++ b/ash/components/login/auth/login_performer.cc
@@ -15,7 +15,6 @@ #include "chromeos/metrics/login_event_recorder.h" #include "components/account_id/account_id.h" #include "components/prefs/pref_service.h" -#include "components/user_manager/user_manager.h" #include "components/user_manager/user_names.h" #include "google_apis/gaia/gaia_auth_util.h" @@ -58,13 +57,6 @@ // Do not distinguish between offline and online success. metrics_recorder_->OnLoginSuccess(OFFLINE_AND_ONLINE); - const bool is_known_user = user_manager::UserManager::Get()->IsKnownUser( - user_context.GetAccountId()); - metrics_recorder_->OnIsUserNew(is_known_user); - bool is_login_offline = - user_context.GetAuthFlow() == UserContext::AUTH_FLOW_OFFLINE || - user_context.GetAuthFlow() == UserContext::AUTH_FLOW_EASY_UNLOCK; - metrics_recorder_->OnIsLoginOffline(is_login_offline); VLOG(1) << "LoginSuccess hash: " << user_context.GetUserIDHash(); base::SequencedTaskRunnerHandle::Get()->PostTask(
diff --git a/ash/components/login/auth/metrics_recorder.cc b/ash/components/login/auth/metrics_recorder.cc index 48ef1e49..a66a3ac 100644 --- a/ash/components/login/auth/metrics_recorder.cc +++ b/ash/components/login/auth/metrics_recorder.cc
@@ -5,12 +5,9 @@ #include "ash/components/login/auth/metrics_recorder.h" #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/user_context.h" -#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" -#include "base/strings/strcat.h" namespace ash { namespace { @@ -21,40 +18,9 @@ // Histogram for tracking the reason of login success constexpr char kSuccessReasonHistogramName[] = "Login.SuccessReason"; -// Histogram prefix for tracking login flow -constexpr char kLoginFlowHistogramPrefix[] = "Login.Flow."; - -// Limit definition of "many users" -constexpr int kManyUserLimit = 5; - -// Suffix for grouping total user numbers. Should match suffixes of the -// Login.Flow.{HideUsers, ShowUsers}.* metrics in metadata/ash/histograms.xml -std::string ShowUserPrefix(bool show_users_on_signin) { - return show_users_on_signin ? "ShowUsers." : "HideUsers."; -} - -// Suffix for grouping user counts. Should match suffixes of the -// Login.Flow.{HideUsers, ShowUsers}.* metrics in metadata/ash/histograms.xml -std::string UserCountSuffix(int user_count) { - DCHECK_GE(user_count, 0); - if (user_count <= 0) - return "0"; - - if (user_count == 1) - return "1"; - - if (user_count == 2) - return "2"; - - if (user_count < kManyUserLimit) - return "Few"; - - return "Many"; -} - } // namespace -MetricsRecorder::MetricsRecorder() = default; +MetricsRecorder::MetricsRecorder() {} MetricsRecorder::~MetricsRecorder() = default; @@ -74,62 +40,4 @@ base::RecordAction(base::UserMetricsAction("Login_GuestLoginSuccess")); } -void MetricsRecorder::OnUserCount(bool user_count) { - user_count_ = user_count; - MaybeReportFlowMetrics(); -} - -void MetricsRecorder::OnShowUsersOnSignin(bool show_users_on_signin) { - show_users_on_signin_ = show_users_on_signin; - MaybeReportFlowMetrics(); -} - -void MetricsRecorder::OnEnableEphemeralUsers(bool enable_ephemeral_users) { - enable_ephemeral_users_ = enable_ephemeral_users; - MaybeUpdateUserLoginType(); -} - -void MetricsRecorder::OnIsUserNew(bool is_new_user) { - is_new_user_ = is_new_user; - MaybeUpdateUserLoginType(); -} - -void MetricsRecorder::OnIsLoginOffline(bool is_login_offline) { - is_login_offline_ = is_login_offline; - MaybeUpdateUserLoginType(); -} - -void MetricsRecorder::MaybeUpdateUserLoginType() { - if (!is_login_offline_.has_value() || !is_new_user_.has_value() || - !enable_ephemeral_users_.has_value()) - return; - - if (is_login_offline_.value()) { - user_login_type_ = MetricsRecorder::kOffline; - } else if (!is_new_user_.value()) { - // The rest 3 online login types are with either existing user and new users - user_login_type_ = MetricsRecorder::kOnlineExisting; - } else if (enable_ephemeral_users_.value()) { - // The rest 2 new user login types are either ephemeral or new online users - user_login_type_ = MetricsRecorder::kEphemeral; - } else { - user_login_type_ = MetricsRecorder::kOnlineNew; - } - - MaybeReportFlowMetrics(); -} - -void MetricsRecorder::MaybeReportFlowMetrics() { - if (!show_users_on_signin_.has_value() || !user_count_.has_value() || - !user_login_type_.has_value()) - return; - - std::string prefix = - base::StrCat({kLoginFlowHistogramPrefix, - ShowUserPrefix(show_users_on_signin_.value())}); - std::string suffix = UserCountSuffix(user_count_.value()); - base::UmaHistogramEnumeration(base::StrCat({prefix, suffix}), - user_login_type_.value()); -} - } // namespace ash
diff --git a/ash/components/login/auth/metrics_recorder.h b/ash/components/login/auth/metrics_recorder.h index 4a87843..a13a780 100644 --- a/ash/components/login/auth/metrics_recorder.h +++ b/ash/components/login/auth/metrics_recorder.h
@@ -6,7 +6,6 @@ #define ASH_COMPONENTS_LOGIN_AUTH_METRICS_RECORDER_H_ #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/user_context.h" namespace ash { @@ -15,16 +14,6 @@ // centralize the tracking and reporting. class COMPONENT_EXPORT(ASH_LOGIN_AUTH) MetricsRecorder { public: - // Enum used for UMA. Do NOT reorder or remove entry. Don't forget to - // update LoginFlowUserLoginType enum in enums.xml when adding new entries. - enum UserLoginType { - kOnlineNew = 0, - kOnlineExisting = 1, - kOffline = 2, - kEphemeral = 3, - kMaxValue - }; - // Reports various metrics during the login flow. MetricsRecorder(); MetricsRecorder(const MetricsRecorder&) = delete; @@ -41,38 +30,6 @@ // Logs the guest login success action. void OnGuestLoignSuccess(); - - // Set the total number of regular users on the lock screen. - void OnUserCount(bool user_count); - - // Set the policy setting whether to show users on sign in or not. - void OnShowUsersOnSignin(bool show_users_on_signin); - - // Set the policy setting if ephemeral login are enforced. - void OnEnableEphemeralUsers(bool enable_ephemeral_users); - - // Set whether the last successful login is a new user or not. - void OnIsUserNew(bool is_new_user); - - // Set whether the last successful login is offline or not. - void OnIsLoginOffline(bool is_login_offline); - - private: - // Determine the user login type if 3 information are available: - // is_login_offline_, is_new_user_, enable_ephemeral_users_. - void MaybeUpdateUserLoginType(); - - // Report the user login type in association with policy and total user count - // if 3 information are available: user_count_, show_users_on_signin_, - // user_login_type_. - void MaybeReportFlowMetrics(); - - absl::optional<int> user_count_; - absl::optional<bool> show_users_on_signin_; - absl::optional<bool> enable_ephemeral_users_; - absl::optional<bool> is_new_user_; - absl::optional<bool> is_login_offline_; - absl::optional<UserLoginType> user_login_type_; }; } // namespace ash
diff --git a/ash/public/cpp/login_accelerators.cc b/ash/public/cpp/login_accelerators.cc index 8163f2a..91e2126 100644 --- a/ash/public/cpp/login_accelerators.cc +++ b/ash/public/cpp/login_accelerators.cc
@@ -14,8 +14,6 @@ const char kAccelNameCancel[] = "cancel"; const char kAccelNameVersion[] = "version"; const char kAccelNameReset[] = "reset"; -const char kAccelNameAppLaunchBailout[] = "app_launch_bailout"; -const char kAccelNameAppLaunchNetworkConfig[] = "app_launch_network_config"; } // namespace @@ -36,11 +34,11 @@ }, { kAppLaunchBailout, ui::VKEY_S, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, - false, kScopeOobe | kScopeLogin, + true, kScopeOobe | kScopeLogin, }, { kAppLaunchNetworkConfig, ui::VKEY_N, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, - false, kScopeOobe | kScopeLogin, + true, kScopeOobe | kScopeLogin, }, { kCancelScreenAction, ui::VKEY_ESCAPE, ui::EF_NONE, @@ -89,12 +87,10 @@ return kAccelNameVersion; case LoginAcceleratorAction::kShowResetScreen: return kAccelNameReset; - case LoginAcceleratorAction::kAppLaunchBailout: - return kAccelNameAppLaunchBailout; - case LoginAcceleratorAction::kAppLaunchNetworkConfig: - return kAccelNameAppLaunchNetworkConfig; case LoginAcceleratorAction::kCancelScreenAction: return kAccelNameCancel; + case LoginAcceleratorAction::kAppLaunchBailout: + case LoginAcceleratorAction::kAppLaunchNetworkConfig: case LoginAcceleratorAction::kShowFeedback: case LoginAcceleratorAction::kStartEnrollment: case LoginAcceleratorAction::kStartKioskEnrollment:
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb index 6664bdbb..e1509987 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb
@@ -71,6 +71,7 @@ <translation id="3140353188828248647">Ünvan panelinə fokuslanın</translation> <translation id="3256109297135787951">Rəfdəki elementdən vurğulamanı silin</translation> <translation id="3288816184963444640">Hazırkı pəncərəni bağlayın</translation> +<translation id="3322797428033495633">Şəkildə şəkil pəncərəsinə fokuslanın</translation> <translation id="3350805006883559974">Yuxarıda aktiv pəncərəni hərəkət etdirin</translation> <translation id="3407560819924487926">Tapşırıq menecerini təkmilləşdirin</translation> <translation id="3417835166382867856">Tabları axtarın</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_en-GB.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_en-GB.xtb index 442dbee..3765bb1 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_en-GB.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_en-GB.xtb
@@ -71,6 +71,7 @@ <translation id="3140353188828248647">Focus address bar</translation> <translation id="3256109297135787951">Remove the highlight from an item on your shelf</translation> <translation id="3288816184963444640">Close the current window</translation> +<translation id="3322797428033495633">Focus the picture-in-picture window</translation> <translation id="3350805006883559974">Float active window on top</translation> <translation id="3407560819924487926">Bring up task manager</translation> <translation id="3417835166382867856">Search tabs</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb index 868bc18..622fd00 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb
@@ -71,6 +71,7 @@ <translation id="3140353188828248647">ფოკუსი მისამართის ზოლი</translation> <translation id="3256109297135787951">თაროზე ერთეულის გამოყოფის გაუქმება</translation> <translation id="3288816184963444640">მიმდინარე ფანჯრის დახურვა</translation> +<translation id="3322797428033495633">რეჟიმის „ეკრანი ეკრანში“ ფანჯრის ფოკუსში მოქცევა</translation> <translation id="3350805006883559974">აქტიური ფანჯრის წინა პლანზე დატოვება</translation> <translation id="3407560819924487926">ამოცანების მმართველის გახსნა</translation> <translation id="3417835166382867856">ჩანართებში ძიება</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lo.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lo.xtb index 67da015c..6394832 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lo.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lo.xtb
@@ -71,6 +71,7 @@ <translation id="3140353188828248647">ແຖບທີ່ຢູ່ຈຸດສຸມ</translation> <translation id="3256109297135787951">ລຶບໄຮໄລ້ອອກຈາກລາຍການໃນຖ້ານຂອງທ່ານ</translation> <translation id="3288816184963444640">ປິດໜ້າຈໍປັດຈຸບັນ</translation> +<translation id="3322797428033495633">ໂຟກັສໜ້າຈໍການສະແດງຜົນຊ້ອນກັນ</translation> <translation id="3350805006883559974">ໜ້າຈໍທີ່ນຳໃຊ້ທີ່ລອຍຢູ່ເທິງສຸດ</translation> <translation id="3407560819924487926">ເປີດຕົວຈັດການໜ້າຈໍຂຶ້ນມາ</translation> <translation id="3417835166382867856">ຊອກຫາແຖບ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lt.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lt.xtb index 6096a1f..6e45395 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lt.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lt.xtb
@@ -71,6 +71,7 @@ <translation id="3140353188828248647">Fokusuoti adreso juostą</translation> <translation id="3256109297135787951">Pašalinti elemento lentynoje paryškinimą</translation> <translation id="3288816184963444640">Uždaryti esamą langą</translation> +<translation id="3322797428033495633">Paryškinti vaizdo vaizde langą</translation> <translation id="3350805006883559974">Rodyti slankųjį aktyvų langą viršuje</translation> <translation id="3407560819924487926">Rodyti užduočių tvarkytuvę</translation> <translation id="3417835166382867856">Ieškoti skirtukų</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb index 613cfce5..f427a4a 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb
@@ -71,6 +71,7 @@ <translation id="3140353188828248647">Хаягийн мөрөнд төвлөрөх</translation> <translation id="3256109297135787951">Тавиур дээрх зүйлээсээ тодруулгыг устгах</translation> <translation id="3288816184963444640">Одоогийн цонхыг хаах</translation> +<translation id="3322797428033495633">Дэлгэц доторх дэлгэц цонхыг сонгох</translation> <translation id="3350805006883559974">Идэвхтэй цонхыг дээд хэсэгт хөвүүлэх</translation> <translation id="3407560819924487926">Ажлын менежерийг ажиллуулах</translation> <translation id="3417835166382867856">Табуудыг хайх</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 18e75e6..ae3a882 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">আপোনাৰ ডিভাইচ, এপ্, ছেটিংসমূহ, ৱেব সন্ধান কৰক...</translation> <translation id="6179832488876878285">আপুনি নিজৰ গুৰুত্বপূৰ্ণ ফাইলসমূহ ইয়াত পিন কৰিব পাৰে। আৰম্ভ কৰিবলৈ Files এপ্টো খোলক।</translation> <translation id="619279033188484792">আপোনাৰ <ph name="DEVICE_TYPE" />ত নিজৰ ফ’নটোৰ শেহতীয়া ফট, মিডিয়া আৰু জাননী চাওক</translation> +<translation id="619335566042889110">এতিয়াই সম্পূৰ্ণৰূপে চাৰ্জ কৰক</translation> <translation id="6220928844947387476">আপুনি এতিয়া একে সময়তে নিজক আৰু আপোনাৰ স্ক্ৰীনখন ৰেকৰ্ড কৰিব পাৰে</translation> <translation id="622484624075952240">Down</translation> <translation id="6231419273573514727">পৰিধীয় আহিলাৰ কাৰ্যক্ষমতা সীমিত হ’ব পাৰে</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409"><ph name="USER_EMAIL_ADDRESS" />ৰ বাবে আনলক কৰিবলৈ এণ্টাৰ টিপক</translation> <translation id="8261506727792406068">মচক</translation> <translation id="8270450402312105425">{0,plural, =1{এঘণ্টাৰ ভিতৰত ডিভাইচটো পূৰ্বৱৰ্তী সংস্কৰণলৈ সলনি কৰক}one{# ঘণ্টাৰ ভিতৰত ডিভাইচটো পূৰ্বৱৰ্তী সংস্কৰণলৈ সলনি কৰক}other{# ঘণ্টাৰ ভিতৰত ডিভাইচটো পূৰ্বৱৰ্তী সংস্কৰণলৈ সলনি কৰক}}</translation> +<translation id="8271580342040932214">বেটাৰীৰ জীৱনকাল বৃদ্ধি কৰিবলৈ প্লাগ ইন হৈ থকা অৱস্থাত সেইটোৰ চাৰ্জ সাময়িকভাৱে ৮০% কৰি ৰখা হৈছে। আপোনাৰ বেটাৰীটো <ph name="FULLY_CHARGE_TIME" />ৰ ভিতৰত সম্পূৰ্ণৰূপে চাৰ্জ হ’ব।</translation> <translation id="8284362522226889623">পূৰ্বৱৰ্তী ডেস্কখনলৈ সলনি কৰিবলৈ চাৰিটা আঙুলিৰে বাওঁফালে ছোৱাইপ কৰক</translation> <translation id="828708037801473432">অফ আছে</translation> <translation id="8297006494302853456">দুৰ্বল</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">ৱাই-ফাই</translation> <translation id="881757059229893486">ইনপুট পদ্ধতিৰ ছেটিং</translation> <translation id="8818320199597151042">প্ৰ’ফাইলটো আঁতৰাই থকা হৈছে। কেইমিনিটমান অপেক্ষা কৰক।</translation> +<translation id="8819728065740986820">অভিযোজিত চাৰ্জিং অন কৰা আছে</translation> <translation id="8825863694328519386">উভতি যাবলৈ বাওঁফালৰ পৰা ছোৱাইপ কৰক</translation> <translation id="8834539327799336565">বৰ্তমান সংযোজিত হৈ আছে</translation> <translation id="8841375032071747811">পূর্বৱর্তী পৃষ্ঠালৈ যোৱা বুটাম</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">গৃহ স্ক্ৰীনলৈ যাবলৈ ওপৰৰ ফালে ছোৱাইপ কৰক</translation> <translation id="9080206825613744995">মাইক্ৰ’ফ’ন ব্যৱহাৰ কৰি থকা হৈছে</translation> <translation id="9084606467167974638">মেনুৰ দিশ ট'গল কৰক</translation> +<translation id="9085962983642906571">বেটাৰীৰ জীৱনকাল বৃদ্ধি কৰিবলৈ প্লাগ ইন হৈ থকা অৱস্থাত সেইটোৰ চাৰ্জ ৮০% কৰি ৰখা হৈছে।</translation> <translation id="9089416786594320554">ইনপুট পদ্ধতি</translation> <translation id="9091626656156419976">ডিছপ্লে' <ph name="DISPLAY_NAME" /> আঁতৰোৱা হ'ল</translation> <translation id="9098969848082897657">ফ’নটো নীৰৱ কৰক</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 9d33e3f..1574205 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">Cihaz, tətbiqlər, ayarlar, vebdə və s. axtarın</translation> <translation id="6179832488876878285">Vacib fayllarınızı buraya bərkidə bilərsiniz. Başlamaq üçün Fayllar tətbiqini açın.</translation> <translation id="619279033188484792"><ph name="DEVICE_TYPE" /> cihazında telefonunuzun son fotolarına, media və bildirişlərinə baxın</translation> +<translation id="619335566042889110">İndi tam şarj edin</translation> <translation id="6220928844947387476">İndi özünüzü və ekranınızı eyni vaxtda çəkə bilərsiniz</translation> <translation id="622484624075952240">Aşağı</translation> <translation id="6231419273573514727">Periferik cihaz performansı məhdud ola bilər</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409"><ph name="USER_EMAIL_ADDRESS" /> üçün kiliddən çıxarmaq üçün Enter düyməsini basın</translation> <translation id="8261506727792406068">Silin</translation> <translation id="8270450402312105425">{0,plural, =1{Bir saat ərzində cihazı əvvəlki versiyaya dəyişdirin}other{# saat ərzində cihazı əvvəlki versiyaya dəyişdirin}}</translation> +<translation id="8271580342040932214">Batareyanın ömrünü uzatmaq üçün enerji mənbəyinə qoşulduqda batareyanız müvəqqəti olaraq 80% səviyyəsində olur. Batareya bu vaxtadək tam şarj ediləcək: <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">Əvvəlki masaya keçmək üçün dörd barmaqla sola çəkin</translation> <translation id="828708037801473432">Deaktiv</translation> <translation id="8297006494302853456">Zəif</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">Daxiletmə Metodları Ayarları</translation> <translation id="8818320199597151042">Profil silinir. Bir neçə dəqiqə gözləyin.</translation> +<translation id="8819728065740986820">Adaptiv şarj aktivdir</translation> <translation id="8825863694328519386">Geri qayıtmaq üçün soldan sürüşdürün</translation> <translation id="8834539327799336565">Hazırda qoşulub</translation> <translation id="8841375032071747811">"Geri" düyməsi</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">Əsas səhifəyə keçmək üçün yuxarı çəkin</translation> <translation id="9080206825613744995">Mikrofon istifadə olunur.</translation> <translation id="9084606467167974638">Menyu vəziyyətini dəyişin</translation> +<translation id="9085962983642906571">Batareyanın ömrünü uzatmaq üçün enerji mənbəyinə qoşulduqda batareyanız 80% səviyyəsində saxlanılır.</translation> <translation id="9089416786594320554">Daxiletmə metodları</translation> <translation id="9091626656156419976"><ph name="DISPLAY_NAME" /> silindi</translation> <translation id="9098969848082897657">Telefonu səssiz edin</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 3a29867e..43f6f5a9c 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">Pretražite uređaj, aplikacije, postavke, web...</translation> <translation id="6179832488876878285">Ovdje možete zakačiti važne fajlove. Otvorite aplikaciju Fajlovi da započnete.</translation> <translation id="619279033188484792">Pregledajte nedavne fotografije, medije i obavještenja telefona na uređaju <ph name="DEVICE_TYPE" /></translation> +<translation id="619335566042889110">Odmah napunite do kraja</translation> <translation id="6220928844947387476">Sada istovremeno možete snimati sebe i svoj ekran</translation> <translation id="622484624075952240">Dolje</translation> <translation id="6231419273573514727">Performanse perifernog uređaja su možda ograničene</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409">Pritisnite Enter da otključate za korisnika <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">Izbriši</translation> <translation id="8270450402312105425">{0,plural, =1{Vratite uređaj na prethodnu verziju u roku od jednog sata}one{Vratite uređaj na prethodnu verziju u roku od # sata}few{Vratite uređaj na prethodnu verziju u roku od # sata}other{Vratite uređaj na prethodnu verziju u roku od # sati}}</translation> +<translation id="8271580342040932214">Baterija je trenutačno na 80% i priključena u produljenje trajanja baterije. Napunit će se do kraja do <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">Prevucite ulijevo s četiri prsta da prebacite na prethodnu radnu površinu</translation> <translation id="828708037801473432">Isključeno</translation> <translation id="8297006494302853456">Slabo</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">WiFi</translation> <translation id="881757059229893486">Postavke načina unosa</translation> <translation id="8818320199597151042">Uklanjanje profila. Pričekajte nekoliko minuta.</translation> +<translation id="8819728065740986820">Uključeno je adaptivno punjenje</translation> <translation id="8825863694328519386">Prevucite prstom slijeva nadesno da se vratite</translation> <translation id="8834539327799336565">Trenutno povezano</translation> <translation id="8841375032071747811">Dugme Nazad</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">Prevucite prema gore da odete na početnu stranicu</translation> <translation id="9080206825613744995">Mikrofon je u upotrebi.</translation> <translation id="9084606467167974638">Promijenite položaj menija</translation> +<translation id="9085962983642906571">Baterija se zadržava na 80% dok je priključena u produljenje trajanja baterije.</translation> <translation id="9089416786594320554">Načini unosa</translation> <translation id="9091626656156419976">Uklonjen je ekran <ph name="DISPLAY_NAME" /></translation> <translation id="9098969848082897657">Utišavanje telefona</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 6855d02..c36471a9 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -851,6 +851,7 @@ <translation id="6166852626429024716">Auf deinem Gerät, in Apps, Einstellungen oder im Web suchen…</translation> <translation id="6179832488876878285">Du kannst wichtige Dateien hier anpinnen. Öffne die Dateien App, um zu starten.</translation> <translation id="619279033188484792">Letzte Fotos, Medien und Benachrichtigungen von deinem Smartphone auf deinem Gerät „<ph name="DEVICE_TYPE" />“ ansehen</translation> +<translation id="619335566042889110">Jetzt vollständig aufladen</translation> <translation id="6220928844947387476">Jetzt kannst du dich selbst und deinen Bildschirm gleichzeitig aufnehmen</translation> <translation id="622484624075952240">Abwärts</translation> <translation id="6231419273573514727">Die Leistung der Peripheriegeräte ist möglicherweise eingeschränkt</translation> @@ -1185,6 +1186,7 @@ <translation id="826107067893790409">Zum Entsperren für <ph name="USER_EMAIL_ADDRESS" /> Eingabetaste drücken</translation> <translation id="8261506727792406068">Löschen</translation> <translation id="8270450402312105425">{0,plural, =1{Gerät innerhalb von einer Stunde auf eine frühere Version zurücksetzen}other{Gerät innerhalb von # Stunden auf eine frühere Version zurücksetzen}}</translation> +<translation id="8271580342040932214">Dein Akku bleibt vorübergehend mit 80 % aufgeladen, während er ans Stromnetz angeschlossen ist, um die Akkulaufzeit zu verlängern. Bis <ph name="FULLY_CHARGE_TIME" /> wird der Akku vollständig aufgeladen.</translation> <translation id="8284362522226889623">Wische mit vier Fingern nach links, um zum vorigen Desktop zu wechseln</translation> <translation id="828708037801473432">Aus</translation> <translation id="8297006494302853456">Schwach</translation> @@ -1268,6 +1270,7 @@ <translation id="8814190375133053267">WLAN</translation> <translation id="881757059229893486">Einstellungen für Eingabemethoden</translation> <translation id="8818320199597151042">Profil wird entfernt. Warte ein paar Minuten.</translation> +<translation id="8819728065740986820">Adaptives Laden ist aktiviert</translation> <translation id="8825863694328519386">Von links nach rechts wischen, um zurückzugehen</translation> <translation id="8834539327799336565">Derzeit verbunden</translation> <translation id="8841375032071747811">Schaltfläche "Zurück"</translation> @@ -1314,6 +1317,7 @@ <translation id="9080132581049224423">Nach oben wischen, um zum Startbildschirm zu gehen</translation> <translation id="9080206825613744995">Mikrofon wird verwendet.</translation> <translation id="9084606467167974638">Menüposition wechseln</translation> +<translation id="9085962983642906571">Dein Akku bleibt mit 80 % aufgeladen, während er ans Stromnetz angeschlossen ist, um die Akkulaufzeit zu verlängern.</translation> <translation id="9089416786594320554">Eingabemethoden</translation> <translation id="9091626656156419976">Bildschirm <ph name="DISPLAY_NAME" /> wurde entfernt</translation> <translation id="9098969848082897657">Smartphone stummschalten</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index 3ef8ddfd..598708a5 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -855,6 +855,7 @@ <translation id="6166852626429024716">Bilatu gailuan, aplikazioetan, ezarpenetan, sarean…</translation> <translation id="6179832488876878285">Hemen aingura ditzakezu fitxategi garrantzitsuak. Hasteko, erabili Fitxategiak aplikazioa.</translation> <translation id="619279033188484792">Ikusi telefonoko azken argazkiak, multimedia-elementuak eta jakinarazpenak <ph name="DEVICE_TYPE" /> bidez</translation> +<translation id="619335566042889110">Kargatu guztiz</translation> <translation id="6220928844947387476">Zeure burua eta pantaila aldi berean graba ditzakezu orain</translation> <translation id="622484624075952240">Behera</translation> <translation id="6231419273573514727">Baliteke gailu periferikoaren errendimendua mugatuta egotea</translation> @@ -1190,6 +1191,7 @@ <translation id="826107067893790409">Sakatu Sartu <ph name="USER_EMAIL_ADDRESS" /> desblokeatzeko</translation> <translation id="8261506727792406068">Ezabatu</translation> <translation id="8270450402312105425">{0,plural, =1{Itzuli gailuaren aurreko bertsiora ordubete barru}other{Itzuli gailuaren aurreko bertsiora # ordu barru}}</translation> +<translation id="8271580342040932214">Bateria % 80ean egongo da gailua entxufatuta egon bitartean, bateriaren iraupena luzatzeko. Ordu honetan kargatuko da guztiz bateria: <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">Aurreko lan-eremura itzultzeko, pasatu lau hatz ezkerrera</translation> <translation id="828708037801473432">Desaktibatuta</translation> <translation id="8297006494302853456">Ahula</translation> @@ -1273,6 +1275,7 @@ <translation id="8814190375133053267">Wi-Fi konexioa</translation> <translation id="881757059229893486">Idazketa-metodoen ezarpenak</translation> <translation id="8818320199597151042">Profila kentzen. Itxaron minutu batzuk.</translation> +<translation id="8819728065740986820">Karga egokitua aktibatuta dago</translation> <translation id="8825863694328519386">Atzera egiteko, pasatu hatza ezkerretik eskuinera</translation> <translation id="8834539327799336565">Konektatuta daudenak</translation> <translation id="8841375032071747811">Atzera botoia</translation> @@ -1319,6 +1322,7 @@ <translation id="9080132581049224423">Orri nagusira joateko, pasatu hatza gora</translation> <translation id="9080206825613744995">Mikrofonoa abian da.</translation> <translation id="9084606467167974638">Aldatu menuaren kokapena</translation> +<translation id="9085962983642906571">Bateria % 80ean mantentzen da gailua entxufatuta egon bitartean, bateriaren iraupena luzatzeko.</translation> <translation id="9089416786594320554">Idazketa-metodoak</translation> <translation id="9091626656156419976">Kendu da <ph name="DISPLAY_NAME" /> pantaila</translation> <translation id="9098969848082897657">Isilarazi telefonoa</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index b1752aa..9ec992aa 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">Maghanap sa iyong device, mga app, mga setting, web...</translation> <translation id="6179832488876878285">Puwede mong i-pin ang iyong mahahalagang file dito. Buksan ang app na Mga File para magsimula.</translation> <translation id="619279033188484792">Tingnan ang mga kamakailang larawan, media, at notification ng iyong telepono sa <ph name="DEVICE_TYPE" /> mo</translation> +<translation id="619335566042889110">Ganap na i-charge ngayon</translation> <translation id="6220928844947387476">Puwede mo na ngayong sabay na i-record ang iyong sarili at ang screen mo</translation> <translation id="622484624075952240">Down</translation> <translation id="6231419273573514727">Posibleng maging limitado ang performance ng peripheral</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409">Pindutin ang Enter para ma-unlock ang <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">I-delete</translation> <translation id="8270450402312105425">{0,plural, =1{Ibalik sa nakaraang bersyon ang device sa loob ng isang oras}one{Ibalik sa nakaraang bersyon ang device sa loob ng # oras}other{Ibalik sa nakaraang bersyon ang device sa loob ng # na oras}}</translation> +<translation id="8271580342040932214">Pansamantalang nasa 80% ang iyong baterya kapag nakasaksak ito para patagalin ang baterya. Ganap na magcha-charge ang iyong baterya bago ang <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">Mag-swipe pakaliwa gamit ang apat na daliri para lumipat sa nakaraang desk</translation> <translation id="828708037801473432">Naka-off</translation> <translation id="8297006494302853456">Mahina</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">Mga Setting ng Mga Pamamaraan ng Pag-input</translation> <translation id="8818320199597151042">Inaalis ang profile. Maghintay nang ilang minuto.</translation> +<translation id="8819728065740986820">Naka-on ang adaptive na pag-charge</translation> <translation id="8825863694328519386">Mag-swipe mula sa kaliwa para bumalik</translation> <translation id="8834539327799336565">Kasalukuyang nakakonekta</translation> <translation id="8841375032071747811">Button na Bumalik</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">Mag-swipe pataas para pumunta sa home</translation> <translation id="9080206825613744995">Ginagamit ang mikropono.</translation> <translation id="9084606467167974638">I-toggle ang posisyon ng menu</translation> +<translation id="9085962983642906571">Pinapanatili sa 80% ang iyong baterya kapag nakasaksak ito para patagalin ang baterya.</translation> <translation id="9089416786594320554">Mga input method</translation> <translation id="9091626656156419976">Naalis ang display na <ph name="DISPLAY_NAME" /></translation> <translation id="9098969848082897657">I-silent ang telepono</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index a3ac4e1..07b9fcf 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">Pretražite uređaj, aplikacije, postavke, web...</translation> <translation id="6179832488876878285">Ovdje možete prikvačiti svoje važne datoteke. Da biste započeli, otvorite aplikaciju Datoteke.</translation> <translation id="619279033188484792">Pregledajte nedavne fotografije, medije i obavijesti telefona na uređaju <ph name="DEVICE_TYPE" />.</translation> +<translation id="619335566042889110">Odmah napunite do kraja</translation> <translation id="6220928844947387476">Sad možete snimiti sebe i zaslon istovremeno.</translation> <translation id="622484624075952240">Dolje</translation> <translation id="6231419273573514727">Rad perifernih uređaja može biti ograničen</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409">Pritisnite Enter za otključavanje za <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">Izbriši</translation> <translation id="8270450402312105425">{0,plural, =1{Vratite uređaj na prethodnu verziju u roku od sat vremena}one{Vratite uređaj na prethodnu verziju u roku od # h}few{Vratite uređaj na prethodnu verziju u roku od # h}other{Vratite uređaj na prethodnu verziju u roku od # h}}</translation> +<translation id="8271580342040932214">Baterija je trenutačno na 80% i priključena u produljenje trajanja baterije. Napunit će se do kraja do <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">Da biste prešli na prethodnu radnu površinu, prijeđite s četiri prsta ulijevo</translation> <translation id="828708037801473432">Isključeno</translation> <translation id="8297006494302853456">Slab</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">Postavke načina unosa</translation> <translation id="8818320199597151042">Profil se uklanja. Pričekajte nekoliko minuta.</translation> +<translation id="8819728065740986820">Uključeno je adaptivno punjenje</translation> <translation id="8825863694328519386">Prijeđite prstom slijeva nadesno da biste se vratili</translation> <translation id="8834539327799336565">Trenutačno povezano</translation> <translation id="8841375032071747811">Gumb Natrag</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">Prijeđite prstom prema gore da biste otvorili početni zaslon</translation> <translation id="9080206825613744995">Upotrebljava se mikrofon.</translation> <translation id="9084606467167974638">Promijenite položaj izbornika</translation> +<translation id="9085962983642906571">Baterija se zadržava na 80% dok je priključena u produljenje trajanja baterije.</translation> <translation id="9089416786594320554">Načini unosa</translation> <translation id="9091626656156419976">Zaslon <ph name="DISPLAY_NAME" /> uklonjen je</translation> <translation id="9098969848082897657">Utišaj telefon</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index a805a9e..ea8c26b 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -855,6 +855,7 @@ <translation id="6166852626429024716">Kereshet az eszközén, az alkalmazások és a beállítások között, az interneten…</translation> <translation id="6179832488876878285">Ide kitűzheti a fontos fájlokat. A kezdéshez nyissa meg a Fájlok alkalmazást.</translation> <translation id="619279033188484792">A telefonján található friss fotók, média és értesítések megtekintése <ph name="DEVICE_TYPE" /> eszközén</translation> +<translation id="619335566042889110">Töltés a teljes akkumulátorszint eléréséig most</translation> <translation id="6220928844947387476">Mostantól egyszerre veheti fel magát és képernyőjét</translation> <translation id="622484624075952240">Le</translation> <translation id="6231419273573514727">Korlátozott lehet a perifériás teljesítmény</translation> @@ -1190,6 +1191,7 @@ <translation id="826107067893790409">Nyomja meg az Enter billentyűt a következő fiók számára való feloldáshoz: <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">Törlés</translation> <translation id="8270450402312105425">{0,plural, =1{Eszköz módosítása az előző verzióra egy órán belül}other{Eszköz módosítása az előző verzióra # órán belül}}</translation> +<translation id="8271580342040932214">Az akkumulátor-élettartam növelése érdekében az akkumulátorszint ideiglenesen 80%-on marad, amíg csatlakoztatva van az áramforráshoz. Az akkumulátor teljesen feltöltődik a következő időpontig: <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">Csúsztasson balra négy ujjal az előző asztalra váltáshoz</translation> <translation id="828708037801473432">Ki</translation> <translation id="8297006494302853456">Gyenge</translation> @@ -1273,6 +1275,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">Beviteli módszerek beállításai</translation> <translation id="8818320199597151042">Profil eltávolítása. Várjon néhány percet.</translation> +<translation id="8819728065740986820">Az adaptív töltés be van kapcsolva</translation> <translation id="8825863694328519386">A visszalépéshez csúsztasson balról jobbra</translation> <translation id="8834539327799336565">Csatlakoztatva</translation> <translation id="8841375032071747811">Vissza gomb</translation> @@ -1319,6 +1322,7 @@ <translation id="9080132581049224423">Felfelé csúsztatva megjelenik a kezdőképernyő</translation> <translation id="9080206825613744995">A mikrofon használatban van.</translation> <translation id="9084606467167974638">Menü helyzetének módosítása</translation> +<translation id="9085962983642906571">Az akkumulátor-élettartam növelése érdekében az akkumulátorszint 80%-on marad, amíg csatlakoztatva van az áramforráshoz.</translation> <translation id="9089416786594320554">Beviteli módszerek</translation> <translation id="9091626656156419976">A(z) <ph name="DISPLAY_NAME" /> kijelző eltávolítva</translation> <translation id="9098969848082897657">Telefon némítása</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 477f00f..cd56b2a9f 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">חיפוש במכשיר, באפליקציות, בהגדרות, באינטרנט...</translation> <translation id="6179832488876878285">כאן אפשר להצמיד את הקבצים החשובים. יש לפתוח את אפליקציית 'קבצים' כדי להתחיל.</translation> <translation id="619279033188484792">הצגת התראות, מדיה ותמונות מהזמן האחרון במכשיר <ph name="DEVICE_TYPE" /></translation> +<translation id="619335566042889110">לטעינה מלאה</translation> <translation id="6220928844947387476">יש לך אפשרות להקליט את עצמך ואת המסך באותו הזמן</translation> <translation id="622484624075952240">למטה</translation> <translation id="6231419273573514727">ייתכן שהביצועים של הציוד ההיקפי יוגבלו</translation> @@ -1191,6 +1192,7 @@ <translation id="826107067893790409">יש להקיש על Enter כדי לבטל את הנעילה בשביל <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">מחיקה</translation> <translation id="8270450402312105425">{0,plural, =1{שינוי המכשיר לגרסה קודמת בתוך שעה}two{שינוי המכשיר לגרסה קודמת בתוך שעתיים}many{שינוי המכשיר לגרסה קודמת בתוך # שעות}other{שינוי המכשיר לגרסה קודמת בתוך # שעות}}</translation> +<translation id="8271580342040932214">כדי להאריך את חיי הסוללה, טעינת הסוללה מושהית זמנית ב-80% בזמן החיבור למטען. הסוללה תיטען במלואה עד <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">יש להחליק ימינה בעזרת ארבע אצבעות כדי לעבור לשולחן העבודה הווירטואלי הקודם</translation> <translation id="828708037801473432">כבויה</translation> <translation id="8297006494302853456">חלש</translation> @@ -1274,6 +1276,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">הגדרות של שיטת הקלט</translation> <translation id="8818320199597151042">הסרת הפרופיל מתבצעת. יש להמתין מספר דקות.</translation> +<translation id="8819728065740986820">הטעינה הדינמית מופעלת</translation> <translation id="8825863694328519386">יש להחליק מצד ימין כדי לחזור אחורה</translation> <translation id="8834539327799336565">מחובר עכשיו</translation> <translation id="8841375032071747811">לחצן 'הקודם'</translation> @@ -1320,6 +1323,7 @@ <translation id="9080132581049224423">כדי לחזור לדף הבית, מחליקים כלפי מעלה</translation> <translation id="9080206825613744995">המיקרופון נמצא בשימוש.</translation> <translation id="9084606467167974638">שינוי מיקום התפריט</translation> +<translation id="9085962983642906571">כדי להאריך את חיי הסוללה, טעינת הסוללה מושהית ב-80% בזמן החיבור למטען.</translation> <translation id="9089416786594320554">שיטות קלט</translation> <translation id="9091626656156419976">הוסרה התצוגה של <ph name="DISPLAY_NAME" /></translation> <translation id="9098969848082897657">השתקת הטלפון</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index dd0359a5..acf0e32 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">წამოიწყეთ ძიება თქვენს მოწყობილობაში, აპებში, პარამეტრებსა და ვებში...</translation> <translation id="6179832488876878285">აქ შეგიძლიათ მნიშვნელოვანი ფაილების ჩამაგრება. დასაწყებად გახსენით ფაილების აპი.</translation> <translation id="619279033188484792">ნახეთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები, მედიაფაილები და შეტყობინებები თქვენს <ph name="DEVICE_TYPE" />-ზე</translation> +<translation id="619335566042889110">სრულად დატენა ახლავე</translation> <translation id="6220928844947387476">ახლა თქვენი თავის და ეკრანის ჩაწერა ერთდროულად შეგიძლიათ</translation> <translation id="622484624075952240">ქვემოთ</translation> <translation id="6231419273573514727">შესაძლოა, პერიფერიული მოწყობილობების წარმადობა შეზღუდული იყოს</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409"><ph name="USER_EMAIL_ADDRESS" />-ისთვის განსაბლოკად დააჭირეთ „Enter“-ზე</translation> <translation id="8261506727792406068">წაშლა</translation> <translation id="8270450402312105425">{0,plural, =1{დააბრუნეთ მოწყობილობა წინა ვერსიაზე ერთი საათის განმავლობაში}other{დააბრუნეთ მოწყობილობა წინა ვერსიაზე # საათის განმავლობაში}}</translation> +<translation id="8271580342040932214">ბატარეის მუშაობის ხანგრძლივობის გაზრდის მიზნით, თქვენი ბატარეა დროებით 80%-ზეა, სანამ მიერთებულია ელკვების წყაროსთან. თქვენი ბატარეა რულად დაიტენება <ph name="FULLY_CHARGE_TIME" />-ისთვის.</translation> <translation id="8284362522226889623">წინა სამუშაო მაგიდაზე გადასართველად გადაფურცლეთ მარცხნივ ოთხი თითით</translation> <translation id="828708037801473432">გამორთვა</translation> <translation id="8297006494302853456">სუსტი</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">შეყვანის მეთოდების პარამეტრები</translation> <translation id="8818320199597151042">მიმდინარეობს პროფილის ამოშლა. მოითმინეთ რამდენიმე წუთი.</translation> +<translation id="8819728065740986820">ადაპტირებადი დატენა ჩართულია</translation> <translation id="8825863694328519386">უკან დასაბრუნებლად გადაფურცლეთ მარცხნიდან</translation> <translation id="8834539327799336565">ამჟამად დაკავშირებული</translation> <translation id="8841375032071747811">ღილაკი „უკან“</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">მთავარ გვერდზე გადასასვლელად გადაფურცლეთ ზემოთ</translation> <translation id="9080206825613744995">მიკროფონი გამოიყენება.</translation> <translation id="9084606467167974638">მენიუს პოზიციის გადართვა</translation> +<translation id="9085962983642906571">ბატარეის მუშაობის ხანგრძლივობის გაზრდის მიზნით, თქვენი ბატარეა შენარჩუნდება 80%-ზე, სანამ მიერთებულია ელკვების წყაროსთან.</translation> <translation id="9089416786594320554">შეყვანის მეთოდები</translation> <translation id="9091626656156419976">ეკრანი <ph name="DISPLAY_NAME" /> ამოიშალა</translation> <translation id="9098969848082897657">ტელეფონის ჩაჩუმება</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 0d6516b4..5c2d719 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">기기, 앱, 설정, 웹에서 검색...</translation> <translation id="6179832488876878285">여기에 중요한 파일을 고정할 수 있습니다. 시작하려면 파일 앱을 여세요.</translation> <translation id="619279033188484792">휴대전화의 최근 사진, 미디어, 알림을 <ph name="DEVICE_TYPE" />에서 봅니다.</translation> +<translation id="619335566042889110">지금 완전히 충전하기</translation> <translation id="6220928844947387476">이제 내 모습과 화면을 동시에 녹화할 수 있습니다.</translation> <translation id="622484624075952240">아래</translation> <translation id="6231419273573514727">주변기기 성능이 제한될 수 있습니다</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409">Enter 키를 눌러서 <ph name="USER_EMAIL_ADDRESS" /> 잠금 해제</translation> <translation id="8261506727792406068">삭제</translation> <translation id="8270450402312105425">{0,plural, =1{1시간 이내에 기기를 이전 버전으로 되돌리세요}other{#시간 이내에 기기를 이전 버전으로 되돌리세요}}</translation> +<translation id="8271580342040932214">전원에 연결된 상태에서 배터리 수명 연장을 위해 충전량이 일시적으로 80%로 유지됩니다. 배터리는 <ph name="FULLY_CHARGE_TIME" />에 완전히 충전됩니다.</translation> <translation id="8284362522226889623">이전 데스크로 전환하려면 네 손가락을 사용해 왼쪽으로 스와이프하세요.</translation> <translation id="828708037801473432">사용 안함</translation> <translation id="8297006494302853456">약함</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">입력 방법 설정</translation> <translation id="8818320199597151042">프로필을 삭제하는 중입니다. 잠시만 기다려 주세요.</translation> +<translation id="8819728065740986820">자동 조절 충전 사용 설정됨</translation> <translation id="8825863694328519386">돌아가려면 왼쪽에서 스와이프하세요.</translation> <translation id="8834539327799336565">현재 연결된 기기</translation> <translation id="8841375032071747811">뒤로 버튼</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">위로 스와이프하여 홈으로 이동</translation> <translation id="9080206825613744995">마이크가 사용 중입니다.</translation> <translation id="9084606467167974638">메뉴 위치 전환</translation> +<translation id="9085962983642906571">전원에 연결된 상태에서 배터리 수명 연장을 위해 충전량이 80%로 유지됩니다.</translation> <translation id="9089416786594320554">입력 방법</translation> <translation id="9091626656156419976">디스플레이 <ph name="DISPLAY_NAME" /> 제거됨</translation> <translation id="9098969848082897657">휴대전화 무음 설정</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 23de94d..eab3c25 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">ຊອກຫາອຸປະກອນ, ແອັບ, ການຕັ້ງຄ່າ, ເວັບຂອງທ່ານ...</translation> <translation id="6179832488876878285">ທ່ານສາມາດປັກໝຸດໄຟລ໌ສຳຄັນຂອງທ່ານຢູ່ບ່ອນນີ້. ເປີດແອັບໄຟລ໌ເພື່ອເລີ່ມຕົ້ນ.</translation> <translation id="619279033188484792">ເບິ່ງຮູບພາບ, ມີເດຍ ແລະ ການແຈ້ງເຕືອນຫຼ້າສຸດຂອງໂທລະສັບທ່ານຢູ່ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ</translation> +<translation id="619335566042889110">ສາກໃຫ້ເຕັມຕອນນີ້</translation> <translation id="6220928844947387476">ຕອນນີ້ທ່ານສາມາດບັນທຶກຕົວທ່ານເອງ ແລະ ໜ້າຈໍຂອງທ່ານພ້ອມກັນໄດ້ແລ້ວ</translation> <translation id="622484624075952240">ລົງ</translation> <translation id="6231419273573514727">ປະສິດທິພາບອຸປະກອນຕໍ່ພ່ວງອາດຖືກຈຳກັດໄວ້</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409">ກົດ Enter ເພື່ອປົດລັອກສຳລັບ <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">ລຶບ</translation> <translation id="8270450402312105425">{0,plural, =1{ປ່ຽນອຸປະກອນເປັນເວີຊັນກ່ອນໜ້າພາຍໃນໜຶ່ງຊົ່ວໂມງ}other{ປ່ຽນອຸປະກອນເປັນເວີຊັນກ່ອນໜ້າພາຍໃນ # ຊົ່ວໂມງ}}</translation> +<translation id="8271580342040932214">ແບັດເຕີຣີຂອງທ່ານຈະຢູ່ທີ່ 80% ຊົ່ວຄາວໃນເວລາທີ່ສຽບໄຟໄວ້ເພື່ອຍືດອາຍຸແບັດເຕີຣີ. ແບັດເຕີຣີຂອງທ່ານຈະສາກເຕັມພາຍໃນ <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">ໃຊ້ສີ່ນິ້ວມືປັດໄປຊ້າຍເພື່ອປ່ຽນໄປໃຊ້ໂຕະກ່ອນໜ້າ</translation> <translation id="828708037801473432">ປິດ</translation> <translation id="8297006494302853456">ອ່ອນ</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">ການຕັ້ງຄ່າວິທີການປ້ອນຂໍ້ມູນ</translation> <translation id="8818320199597151042">ກຳລັງລຶບໂປຣໄຟລ໌ອອກ. ກະລຸນາລໍຖ້າສອງສາມນາທີ.</translation> +<translation id="8819728065740986820">ເປີດໃຊ້ການສາກໄຟແບບປັບອັດຕະໂນມັດແລ້ວ</translation> <translation id="8825863694328519386">ປັດຈາກຊ້າຍເພື່ອກັບຄືນ</translation> <translation id="8834539327799336565">ຕອນນີ້ເຊື່ອມຕໍ່ແລ້ວ</translation> <translation id="8841375032071747811">ປຸ່ມກັບຄືນ</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">ປັດຂຶ້ນເພື່ອໄປຫາໜ້າຫຼັກ</translation> <translation id="9080206825613744995">ໄມໂຄຣໂຟນໃຊ້ງານຢູ່.</translation> <translation id="9084606467167974638">ເປີດປິດຕຳແໜ່ງເມນູ</translation> +<translation id="9085962983642906571">ແບັດເຕີຣີຂອງທ່ານຈະຖືກຮັກສາໄວ້ທີ່ 80% ໃນເວລາທີ່ສຽບໄຟເພື່ອຍືດອາຍຸແບັດເຕີຣີ.</translation> <translation id="9089416786594320554">ວິທີການປ້ອນເຂົ້າ</translation> <translation id="9091626656156419976">ລຶບຈໍສະແດງຜົນ <ph name="DISPLAY_NAME" /> ອອກແລ້ວ</translation> <translation id="9098969848082897657">ປິດສຽງໂທລະສັບ</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index c12c50a..aa16303 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -855,6 +855,7 @@ <translation id="6166852626429024716">Пребарувајте низ уредот, апликациите, поставките, на интернет…</translation> <translation id="6179832488876878285">Може да ги закачите вашите важни датотеки тука. Отворете ја апликацијата Files за да започнете.</translation> <translation id="619279033188484792">Прегледувајте ги неодамнешните фотографии, аудиовизуелни содржини и известувања од телефонот на вашиот <ph name="DEVICE_TYPE" /></translation> +<translation id="619335566042889110">Целосно наполни сега</translation> <translation id="6220928844947387476">Сега можете истовремено да се снимате себеси и екранот</translation> <translation id="622484624075952240">Долу</translation> <translation id="6231419273573514727">Перформансите на периферните уреди може да бидат ограничени</translation> @@ -1190,6 +1191,7 @@ <translation id="826107067893790409">Притиснете Enter за да се отклучи за <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">Избриши</translation> <translation id="8270450402312105425">{0,plural, =1{Променете го уредот на претходната верзија во рок од еден час}one{Променете го уредот на претходната верзија во рок од # час}other{Променете го уредот на претходната верзија во рок од # часа}}</translation> +<translation id="8271580342040932214">Батеријата привремено е на 80 % додека е приклучена за да се продолжи траењето на батеријата. Батеријата ќе се наполни целосно до <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">Повлечете налево со четири прста за да се префрлите на претходната работна површина</translation> <translation id="828708037801473432">Исклучено</translation> <translation id="8297006494302853456">Слаб</translation> @@ -1273,6 +1275,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">Поставки за методите за внесување</translation> <translation id="8818320199597151042">Се отстранува профилот. Почекајте неколку минути.</translation> +<translation id="8819728065740986820">„Адаптивното полнење“ е вклучено</translation> <translation id="8825863694328519386">Повлечете одлево за да се вратите назад</translation> <translation id="8834539327799336565">Моментално поврзани</translation> <translation id="8841375032071747811">Копче за назад</translation> @@ -1319,6 +1322,7 @@ <translation id="9080132581049224423">Повлечете нагоре за да појдете на почетен екран</translation> <translation id="9080206825613744995">Се користи микрофонот.</translation> <translation id="9084606467167974638">Промени ја позицијата на менито</translation> +<translation id="9085962983642906571">Батеријата се одржува на 80 % додека е приклучена за да се продолжи траењето на батеријата.</translation> <translation id="9089416786594320554">Влезни методи</translation> <translation id="9091626656156419976">Отстранет екран <ph name="DISPLAY_NAME" /></translation> <translation id="9098969848082897657">Исклучи го звукот на телефонот</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index fc4fccb9..b8ebac6 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -855,6 +855,7 @@ <translation id="6166852626429024716">Төхөөрөмж, апп, тохиргоо, вебээс хайх...</translation> <translation id="6179832488876878285">Та чухал файлуудаа энд бэхлэх боломжтой. Эхлүүлэхийн тулд Файлс аппыг нээнэ үү.</translation> <translation id="619279033188484792"><ph name="DEVICE_TYPE" /> дээрээ утасныхаа саяхны зургууд, медиа болон мэдэгдлүүдийг харна уу</translation> +<translation id="619335566042889110">Одоо бүрэн цэнэглээрэй</translation> <translation id="6220928844947387476">Та одоо өөрийгөө болон дэлгэцээ зэрэг бичих боломжтой</translation> <translation id="622484624075952240">Бууруулсан жагсаалт</translation> <translation id="6231419273573514727">Дагалдах төхөөрөмжийн гүйцэтгэлийг хязгаарласан байж болзошгүй</translation> @@ -1190,6 +1191,7 @@ <translation id="826107067893790409"><ph name="USER_EMAIL_ADDRESS" />-д зориулж түгжээг тайлахын тулд Enter дээр дарна уу</translation> <translation id="8261506727792406068">Устгах</translation> <translation id="8270450402312105425">{0,plural, =1{Төхөөрөмжийг өмнөх хувилбар луу нь 1 цагийн дотор өөрчилнө үү}other{Төхөөрөмжийг өмнөх хувилбар луу нь # цагийн дотор өөрчилнө үү}}</translation> +<translation id="8271580342040932214">Батарейн ажиллах хугацааг уртасгахаар залгасан үед таны батарей түр зуур 80%-тай байна. Таны батарей <ph name="FULLY_CHARGE_TIME" /> гэхэд бүрэн цэнэглэгдэнэ.</translation> <translation id="8284362522226889623">Өмнөх дэлгэц рүү сэлгэхийн тулд дөрвөн хуруугаараа зүүн тийш шударна уу</translation> <translation id="828708037801473432">Унтраалттай</translation> <translation id="8297006494302853456">Сул</translation> @@ -1274,6 +1276,7 @@ <translation id="8814190375133053267">Утасгүй интернет</translation> <translation id="881757059229893486">Оруулах аргын тохиргоо</translation> <translation id="8818320199597151042">Профайлыг хасаж байна. Цөөн хэдэн минут хүлээнэ үү.</translation> +<translation id="8819728065740986820">Орчинтой тохируулан цэнэглэх онцлог асаалттай байна</translation> <translation id="8825863694328519386">Буцахын тулд зүүн талаас шударна уу</translation> <translation id="8834539327799336565">Одоогоор холбогдсон</translation> <translation id="8841375032071747811">Буцах товчлуур</translation> @@ -1320,6 +1323,7 @@ <translation id="9080132581049224423">Нүүр хуудас руу очихын тулд дээш шударна уу</translation> <translation id="9080206825613744995">Микрофоныг ашиглаж байна.</translation> <translation id="9084606467167974638">Цэсийн байршлыг асаах/унтраах</translation> +<translation id="9085962983642906571">Батарейн ажиллах хугацааг уртасгахаар залгасан үед таны батарейг 80%-тай байлгана.</translation> <translation id="9089416786594320554">Оролтын аргууд</translation> <translation id="9091626656156419976"><ph name="DISPLAY_NAME" /> дэлгэцийг хассан</translation> <translation id="9098969848082897657">Утасны дууг хаах</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 5215b00..156b5bdf 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -854,6 +854,7 @@ <translation id="6166852626429024716">Pesquisar no dispositivo, em apps, nas configurações, na Web…</translation> <translation id="6179832488876878285">Fixe seus arquivos importantes aqui. Abra o app Arquivos para começar.</translation> <translation id="619279033188484792">Veja as fotos, mídias e notificações recentes do smartphone no <ph name="DEVICE_TYPE" />.</translation> +<translation id="619335566042889110">Carregar totalmente agora</translation> <translation id="6220928844947387476">Agora é possível gravar você e a tela ao mesmo tempo</translation> <translation id="622484624075952240">Seta para baixo</translation> <translation id="6231419273573514727">O desempenho dos periféricos pode ser limitado</translation> @@ -1189,6 +1190,7 @@ <translation id="826107067893790409">Pressione "Enter" para desbloquear para <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">Excluir</translation> <translation id="8270450402312105425">{0,plural, =1{Reverta o dispositivo para a versão anterior em até 1 hora}one{Reverta o dispositivo para a versão anterior em até # hora}other{Reverta o dispositivo para a versão anterior em até # horas}}</translation> +<translation id="8271580342040932214">A bateria fica temporariamente em 80% enquanto o dispositivo está conectado à fonte de energia para prolongar a duração. Ela será totalmente carregada até <ph name="FULLY_CHARGE_TIME" />.</translation> <translation id="8284362522226889623">Deslize para a esquerda com quatro dedos para acessar o espaço de trabalho anterior</translation> <translation id="828708037801473432">Desativada</translation> <translation id="8297006494302853456">Fraco</translation> @@ -1272,6 +1274,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">Configurações de métodos de entrada</translation> <translation id="8818320199597151042">Removendo o perfil. Aguarde alguns minutos.</translation> +<translation id="8819728065740986820">O Carregamento adaptável está ativado</translation> <translation id="8825863694328519386">Deslize da esquerda para voltar</translation> <translation id="8834539327799336565">Conectados no momento</translation> <translation id="8841375032071747811">Botão "Voltar"</translation> @@ -1318,6 +1321,7 @@ <translation id="9080132581049224423">Deslize para cima para ir para a tela inicial</translation> <translation id="9080206825613744995">O microfone está sendo usado.</translation> <translation id="9084606467167974638">Alternar posição do menu</translation> +<translation id="9085962983642906571">A bateria fica em 80% enquanto o dispositivo está conectado à fonte de energia para prolongar a duração.</translation> <translation id="9089416786594320554">Métodos de entrada</translation> <translation id="9091626656156419976">Tela <ph name="DISPLAY_NAME" /> removida</translation> <translation id="9098969848082897657">Silenciar smartphone</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 864e9fc..e342a2d 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -851,6 +851,7 @@ <translation id="6166852626429024716">ค้นหาอุปกรณ์ แอป การตั้งค่า เว็บ...</translation> <translation id="6179832488876878285">คุณตรึงไฟล์สำคัญๆ ไว้ที่นี่ได้ เปิดแอป Files เพื่อเริ่มต้นใช้งาน</translation> <translation id="619279033188484792">ดูรูปภาพ สื่อ และการแจ้งเตือนล่าสุดของโทรศัพท์ใน <ph name="DEVICE_TYPE" /></translation> +<translation id="619335566042889110">ชาร์จจนเต็มเลย</translation> <translation id="6220928844947387476">ตอนนี้สามารถบันทึกตัวคุณเองไปพร้อมกับหน้าจอได้แล้ว</translation> <translation id="622484624075952240">ลง</translation> <translation id="6231419273573514727">อุปกรณ์ต่อพ่วงอาจมีประสิทธิภาพจำกัด</translation> @@ -1185,6 +1186,7 @@ <translation id="826107067893790409">กด Enter เพื่อปลดล็อกสำหรับ <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8261506727792406068">ลบ</translation> <translation id="8270450402312105425">{0,plural, =1{เปลี่ยนอุปกรณ์เป็นเวอร์ชันก่อนหน้าภายใน 1 ชั่วโมง}other{เปลี่ยนอุปกรณ์เป็นเวอร์ชันก่อนหน้าภายใน # ชั่วโมง}}</translation> +<translation id="8271580342040932214">แบตเตอรี่จะอยู่ที่ระดับ 80% เป็นการชั่วคราวในระหว่างเสียบปลั๊กอยู่เพื่อยืดอายุการใช้งานแบตเตอรี่ แบตเตอรี่จะชาร์จจนเต็มภายใน <ph name="FULLY_CHARGE_TIME" /></translation> <translation id="8284362522226889623">ใช้ 4 นิ้วเลื่อนไปทางซ้ายเพื่อเปลี่ยนไปใช้เดสก์ก่อนหน้า</translation> <translation id="828708037801473432">ปิด</translation> <translation id="8297006494302853456">อ่อน</translation> @@ -1268,6 +1270,7 @@ <translation id="8814190375133053267">Wi-Fi</translation> <translation id="881757059229893486">การตั้งค่าวิธีการป้อนข้อมูล</translation> <translation id="8818320199597151042">กำลังนำโปรไฟล์ออก รอสักครู่</translation> +<translation id="8819728065740986820">การชาร์จแบบปรับอัตโนมัติเปิดอยู่</translation> <translation id="8825863694328519386">เลื่อนจากด้านซ้ายเพื่อย้อนกลับ</translation> <translation id="8834539327799336565">เชื่อมต่ออยู่</translation> <translation id="8841375032071747811">ปุ่มกลับ</translation> @@ -1314,6 +1317,7 @@ <translation id="9080132581049224423">เลื่อนขึ้นเพื่อไปที่หน้าแรก</translation> <translation id="9080206825613744995">ใช้ไมโครโฟนอยู่</translation> <translation id="9084606467167974638">เปลี่ยนตำแหน่งเมนู</translation> +<translation id="9085962983642906571">แบตเตอรี่จะคงไว้ที่ระดับ 80% ในระหว่างเสียบปลั๊กอยู่เพื่อยืดอายุการใช้งานแบตเตอรี่</translation> <translation id="9089416786594320554">วิธีป้อนข้อมูล</translation> <translation id="9091626656156419976">นำจอแสดงผล <ph name="DISPLAY_NAME" /> ออกแล้ว</translation> <translation id="9098969848082897657">ปิดเสียงโทรศัพท์</translation>
diff --git a/ash/webui/telemetry_extension_ui/mojom/diagnostics_service.mojom b/ash/webui/telemetry_extension_ui/mojom/diagnostics_service.mojom index c9a79f0..5214fe4 100644 --- a/ash/webui/telemetry_extension_ui/mojom/diagnostics_service.mojom +++ b/ash/webui/telemetry_extension_ui/mojom/diagnostics_service.mojom
@@ -423,8 +423,10 @@ }; // Enumeration of the possible DiskRead routine's command type -[Stable] +[Stable, Extensible] enum DiskReadRoutineTypeEnum { - kLinearRead, - kRandomRead, + kLinearRead = 0, + kRandomRead = 1, + // Sending this to the underlying cros_healthd will result in an error. + [Default] kUnknown = 2, };
diff --git a/ash/webui/telemetry_extension_ui/services/BUILD.gn b/ash/webui/telemetry_extension_ui/services/BUILD.gn index 0f73a522..7910ac2 100644 --- a/ash/webui/telemetry_extension_ui/services/BUILD.gn +++ b/ash/webui/telemetry_extension_ui/services/BUILD.gn
@@ -10,7 +10,6 @@ sources = [ "bluetooth_observer.cc", "bluetooth_observer.h", - "convert_ptr.h", "diagnostics_service.cc", "diagnostics_service.h", "diagnostics_service_converters.cc", @@ -41,7 +40,6 @@ source_set("unit_tests") { testonly = true sources = [ - "convert_ptr_unittest.cc", "diagnostics_service_converters_unittest.cc", "probe_service_converters_unittest.cc", "probe_service_unittest.cc",
diff --git a/ash/webui/telemetry_extension_ui/services/convert_ptr.h b/ash/webui/telemetry_extension_ui/services/convert_ptr.h deleted file mode 100644 index 8f34157f..0000000 --- a/ash/webui/telemetry_extension_ui/services/convert_ptr.h +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_WEBUI_TELEMETRY_EXTENSION_UI_SERVICES_CONVERT_PTR_H_ -#define ASH_WEBUI_TELEMETRY_EXTENSION_UI_SERVICES_CONVERT_PTR_H_ - -#include <utility> - -#include "ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.h" -#include "ash/webui/telemetry_extension_ui/services/probe_service_converters.h" - -// To use ConvertPtr with other functions, headers to function definitions -// must be included in this file. - -namespace ash { -namespace converters { - -template <class InputT> -auto ConvertPtr(InputT input) { - return (!input.is_null()) ? unchecked::UncheckedConvertPtr(std::move(input)) - : nullptr; -} - -} // namespace converters -} // namespace ash - -#endif // ASH_WEBUI_TELEMETRY_EXTENSION_UI_SERVICES_CONVERT_PTR_H_
diff --git a/ash/webui/telemetry_extension_ui/services/convert_ptr_unittest.cc b/ash/webui/telemetry_extension_ui/services/convert_ptr_unittest.cc deleted file mode 100644 index da0d148..0000000 --- a/ash/webui/telemetry_extension_ui/services/convert_ptr_unittest.cc +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/webui/telemetry_extension_ui/services/convert_ptr.h" - -#include "ash/webui/telemetry_extension_ui/mojom/probe_service.mojom.h" -#include "chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace ash { - -// TODO(https://crbug.com/1164001): Remove if cros_healthd::mojom moved to ash. -namespace cros_healthd { -namespace mojom = ::chromeos::cros_healthd::mojom; -} // namespace cros_healthd - -namespace converters { - -// Tests that |ConvertPtr| function returns nullptr if input is nullptr. -// ConvertPtr is a template, so we can test this function with any valid type. -TEST(TelemetryConvertPtr, ConvertPtrTakesNullPtr) { - EXPECT_TRUE(ConvertPtr(cros_healthd::mojom::ProbeErrorPtr()).is_null()); -} - -} // namespace converters -} // namespace ash
diff --git a/ash/webui/telemetry_extension_ui/services/diagnostics_service.cc b/ash/webui/telemetry_extension_ui/services/diagnostics_service.cc index 8e06891..49e6f16 100644 --- a/ash/webui/telemetry_extension_ui/services/diagnostics_service.cc +++ b/ash/webui/telemetry_extension_ui/services/diagnostics_service.cc
@@ -7,7 +7,6 @@ #include <utility> #include <vector> -#include "ash/webui/telemetry_extension_ui/services/convert_ptr.h" #include "ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.h" #include "base/bind.h" #include "chromeos/services/cros_healthd/public/cpp/service_connection.h" @@ -60,7 +59,8 @@ [](health::mojom::DiagnosticsService::GetRoutineUpdateCallback callback, cros_healthd::mojom::RoutineUpdatePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -71,7 +71,8 @@ [](health::mojom::DiagnosticsService::RunBatteryCapacityRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -82,7 +83,8 @@ [](health::mojom::DiagnosticsService::RunBatteryHealthRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -93,7 +95,8 @@ [](health::mojom::DiagnosticsService::RunSmartctlCheckRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -108,7 +111,8 @@ [](health::mojom::DiagnosticsService::RunAcPowerRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -122,7 +126,8 @@ [](health::mojom::DiagnosticsService::RunCpuCacheRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -136,7 +141,8 @@ [](health::mojom::DiagnosticsService::RunCpuStressRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -150,7 +156,8 @@ [](health::mojom::DiagnosticsService:: RunFloatingPointAccuracyRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -164,7 +171,8 @@ [](health::mojom::DiagnosticsService::RunNvmeWearLevelRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -178,7 +186,8 @@ [](health::mojom::DiagnosticsService::RunNvmeSelfTestRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -194,7 +203,8 @@ [](health::mojom::DiagnosticsService::RunDiskReadRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -208,7 +218,8 @@ [](health::mojom::DiagnosticsService::RunPrimeSearchRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -223,7 +234,8 @@ [](health::mojom::DiagnosticsService:: RunBatteryDischargeRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -238,7 +250,8 @@ [](health::mojom::DiagnosticsService::RunBatteryChargeRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -247,7 +260,8 @@ GetService()->RunMemoryRoutine(base::BindOnce( [](health::mojom::DiagnosticsService::RunMemoryRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); } @@ -258,7 +272,8 @@ [](health::mojom::DiagnosticsService::RunLanConnectivityRoutineCallback callback, cros_healthd::mojom::RunRoutineResponsePtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertDiagnosticsPtr(std::move(ptr))); }, std::move(callback))); }
diff --git a/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.cc b/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.cc index 341e680..f02ece584 100644 --- a/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.cc +++ b/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.cc
@@ -5,7 +5,6 @@ #include "ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.h" #include "ash/webui/telemetry_extension_ui/mojom/diagnostics_service.mojom.h" -#include "ash/webui/telemetry_extension_ui/services/convert_ptr.h" #include "base/notreached.h" #include "base/strings/string_piece.h" #include "chrome/browser/ash/wilco_dtc_supportd/mojo_utils.h" @@ -32,7 +31,7 @@ return health::mojom::RoutineUpdate::New( input->progress_percent, GetStringFromMojoHandle(std::move(input->output)), - ConvertPtr(std::move(input->routine_update_union))); + ConvertDiagnosticsPtr(std::move(input->routine_update_union))); } health::mojom::RoutineUpdateUnionPtr UncheckedConvertPtr( @@ -40,10 +39,10 @@ switch (input->which()) { case cros_healthd::mojom::RoutineUpdateUnion::Tag::kInteractiveUpdate: return health::mojom::RoutineUpdateUnion::NewInteractiveUpdate( - ConvertPtr(std::move(input->get_interactive_update()))); + ConvertDiagnosticsPtr(std::move(input->get_interactive_update()))); case cros_healthd::mojom::RoutineUpdateUnion::Tag::kNoninteractiveUpdate: return health::mojom::RoutineUpdateUnion::NewNoninteractiveUpdate( - ConvertPtr(std::move(input->get_noninteractive_update()))); + ConvertDiagnosticsPtr(std::move(input->get_noninteractive_update()))); } } @@ -230,6 +229,9 @@ return cros_healthd::mojom::DiskReadRoutineTypeEnum::kLinearRead; case health::mojom::DiskReadRoutineTypeEnum::kRandomRead: return cros_healthd::mojom::DiskReadRoutineTypeEnum::kRandomRead; + case health::mojom::DiskReadRoutineTypeEnum::kUnknown: + // Fall-through to not-supported case. + break; } NOTREACHED(); return static_cast<cros_healthd::mojom::DiskReadRoutineTypeEnum>(
diff --git a/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.h b/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.h index a1f748c..149b0ea 100644 --- a/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.h +++ b/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters.h
@@ -69,6 +69,12 @@ cros_healthd::mojom::DiskReadRoutineTypeEnum Convert( health::mojom::DiskReadRoutineTypeEnum input); +template <class InputT> +auto ConvertDiagnosticsPtr(InputT input) { + return (!input.is_null()) ? unchecked::UncheckedConvertPtr(std::move(input)) + : nullptr; +} + } // namespace converters } // namespace ash
diff --git a/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters_unittest.cc b/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters_unittest.cc index f636209..ede0cd76 100644 --- a/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters_unittest.cc +++ b/ash/webui/telemetry_extension_ui/services/diagnostics_service_converters_unittest.cc
@@ -11,6 +11,15 @@ namespace ash { namespace converters { +// Tests that |ConvertDiagnosticsPtr| function returns nullptr if input is +// nullptr. ConvertDiagnosticsPtr is a template, so we can test this function +// with any valid type. +TEST(DiagnosticsServiceConvertersTest, ConvertDiagnosticsPtrTakesNullPtr) { + EXPECT_TRUE( + ConvertDiagnosticsPtr(cros_healthd::mojom::InteractiveRoutineUpdatePtr()) + .is_null()); +} + TEST(DiagnosticsServiceConvertersTest, ConvertDiagnosticRoutineStatusEnum) { namespace cros_healthd = ::chromeos::cros_healthd::mojom; namespace health = ::ash::health::mojom;
diff --git a/ash/webui/telemetry_extension_ui/services/probe_service.cc b/ash/webui/telemetry_extension_ui/services/probe_service.cc index 36e7c80f..3438ad8 100644 --- a/ash/webui/telemetry_extension_ui/services/probe_service.cc +++ b/ash/webui/telemetry_extension_ui/services/probe_service.cc
@@ -6,7 +6,6 @@ #include <utility> -#include "ash/webui/telemetry_extension_ui/services/convert_ptr.h" #include "ash/webui/telemetry_extension_ui/services/probe_service_converters.h" #include "base/bind.h" #include "chromeos/dbus/dbus_thread_manager.h" @@ -18,6 +17,7 @@ namespace ash { namespace { +namespace cros_healthd = ::ash::cros_healthd; constexpr char kOemDataLogName[] = "oemdata"; } // namespace @@ -35,7 +35,8 @@ base::BindOnce( [](health::mojom::ProbeService::ProbeTelemetryInfoCallback callback, cros_healthd::mojom::TelemetryInfoPtr ptr) { - std::move(callback).Run(converters::ConvertPtr(std::move(ptr))); + std::move(callback).Run( + converters::ConvertProbePtr(std::move(ptr))); }, std::move(callback))); }
diff --git a/ash/webui/telemetry_extension_ui/services/probe_service_converters.cc b/ash/webui/telemetry_extension_ui/services/probe_service_converters.cc index c39db06..76ea0f58 100644 --- a/ash/webui/telemetry_extension_ui/services/probe_service_converters.cc +++ b/ash/webui/telemetry_extension_ui/services/probe_service_converters.cc
@@ -8,7 +8,6 @@ #include <utility> #include "ash/webui/telemetry_extension_ui/mojom/probe_service.mojom.h" -#include "ash/webui/telemetry_extension_ui/services/convert_ptr.h" #include "base/notreached.h" #include "base/strings/string_number_conversions.h" #include "chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h" @@ -18,6 +17,8 @@ namespace { +namespace cros_healthd = ::ash::cros_healthd; + cros_healthd::mojom::ProbeCategoryEnum Convert( health::mojom::ProbeCategoryEnum input) { switch (input) { @@ -74,7 +75,7 @@ Convert(input->charge_now), Convert(input->current_now), std::move(input->technology), std::move(input->status), std::move(input->manufacture_date), - ConvertPtr(std::move(input->temperature))); + ConvertProbePtr(std::move(input->temperature))); } health::mojom::BatteryResultPtr UncheckedConvertPtr( @@ -82,10 +83,10 @@ switch (input->which()) { case cros_healthd::mojom::BatteryResult::Tag::kBatteryInfo: return health::mojom::BatteryResult::NewBatteryInfo( - ConvertPtr(std::move(input->get_battery_info()))); + ConvertProbePtr(std::move(input->get_battery_info()))); case cros_healthd::mojom::BatteryResult::Tag::kError: return health::mojom::BatteryResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -100,7 +101,7 @@ Convert(input->read_time_seconds_since_last_boot), Convert(input->write_time_seconds_since_last_boot), Convert(input->io_time_seconds_since_last_boot), - ConvertPtr(std::move(input->discard_time_seconds_since_last_boot))); + ConvertProbePtr(std::move(input->discard_time_seconds_since_last_boot))); } health::mojom::NonRemovableBlockDeviceResultPtr UncheckedConvertPtr( @@ -113,7 +114,7 @@ std::move(input->get_block_device_info()))); case cros_healthd::mojom::NonRemovableBlockDeviceResult::Tag::kError: return health::mojom::NonRemovableBlockDeviceResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -130,10 +131,10 @@ switch (input->which()) { case cros_healthd::mojom::SystemResult::Tag::kSystemInfo: return health::mojom::CachedVpdResult::NewVpdInfo( - ConvertPtr(std::move(input->get_system_info()))); + ConvertProbePtr(std::move(input->get_system_info()))); case cros_healthd::mojom::SystemResult::Tag::kError: return health::mojom::CachedVpdResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -196,10 +197,10 @@ switch (input->which()) { case cros_healthd::mojom::CpuResult::Tag::kCpuInfo: return health::mojom::CpuResult::NewCpuInfo( - ConvertPtr(std::move(input->get_cpu_info()))); + ConvertProbePtr(std::move(input->get_cpu_info()))); case cros_healthd::mojom::CpuResult::Tag::kError: return health::mojom::CpuResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -213,10 +214,10 @@ switch (input->which()) { case cros_healthd::mojom::TimezoneResult::Tag::kTimezoneInfo: return health::mojom::TimezoneResult::NewTimezoneInfo( - ConvertPtr(std::move(input->get_timezone_info()))); + ConvertProbePtr(std::move(input->get_timezone_info()))); case cros_healthd::mojom::TimezoneResult::Tag::kError: return health::mojom::TimezoneResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -233,10 +234,10 @@ switch (input->which()) { case cros_healthd::mojom::MemoryResult::Tag::kMemoryInfo: return health::mojom::MemoryResult::NewMemoryInfo( - ConvertPtr(std::move(input->get_memory_info()))); + ConvertProbePtr(std::move(input->get_memory_info()))); case cros_healthd::mojom::MemoryResult::Tag::kError: return health::mojom::MemoryResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -256,7 +257,7 @@ std::move(input->get_backlight_info()))); case cros_healthd::mojom::BacklightResult::Tag::kError: return health::mojom::BacklightResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -274,7 +275,7 @@ std::move(input->get_fan_info()))); case cros_healthd::mojom::FanResult::Tag::kError: return health::mojom::FanResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -291,10 +292,10 @@ switch (input->which()) { case cros_healthd::mojom::StatefulPartitionResult::Tag::kPartitionInfo: return health::mojom::StatefulPartitionResult::NewPartitionInfo( - ConvertPtr(std::move(input->get_partition_info()))); + ConvertProbePtr(std::move(input->get_partition_info()))); case cros_healthd::mojom::StatefulPartitionResult::Tag::kError: return health::mojom::StatefulPartitionResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -314,7 +315,7 @@ std::move(input->get_bluetooth_adapter_info()))); case cros_healthd::mojom::BluetoothResult::Tag::kError: return health::mojom::BluetoothResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } @@ -325,7 +326,8 @@ health::mojom::SystemInfoPtr UncheckedConvertPtr( cros_healthd::mojom::SystemInfoV2Ptr input) { - return health::mojom::SystemInfo::New(ConvertPtr(std::move(input->os_info))); + return health::mojom::SystemInfo::New( + ConvertProbePtr(std::move(input->os_info))); } health::mojom::SystemResultPtr UncheckedConvertPtr( @@ -333,27 +335,27 @@ switch (input->which()) { case cros_healthd::mojom::SystemResultV2::Tag::kSystemInfoV2: return health::mojom::SystemResult::NewSystemInfo( - ConvertPtr(std::move(input->get_system_info_v2()))); + ConvertProbePtr(std::move(input->get_system_info_v2()))); case cros_healthd::mojom::SystemResultV2::Tag::kError: return health::mojom::SystemResult::NewError( - ConvertPtr(std::move(input->get_error()))); + ConvertProbePtr(std::move(input->get_error()))); } } health::mojom::TelemetryInfoPtr UncheckedConvertPtr( cros_healthd::mojom::TelemetryInfoPtr input) { return health::mojom::TelemetryInfo::New( - ConvertPtr(std::move(input->battery_result)), - ConvertPtr(std::move(input->block_device_result)), - ConvertPtr(std::move(input->system_result)), - ConvertPtr(std::move(input->cpu_result)), - ConvertPtr(std::move(input->timezone_result)), - ConvertPtr(std::move(input->memory_result)), - ConvertPtr(std::move(input->backlight_result)), - ConvertPtr(std::move(input->fan_result)), - ConvertPtr(std::move(input->stateful_partition_result)), - ConvertPtr(std::move(input->bluetooth_result)), - ConvertPtr(std::move(input->system_result_v2))); + ConvertProbePtr(std::move(input->battery_result)), + ConvertProbePtr(std::move(input->block_device_result)), + ConvertProbePtr(std::move(input->system_result)), + ConvertProbePtr(std::move(input->cpu_result)), + ConvertProbePtr(std::move(input->timezone_result)), + ConvertProbePtr(std::move(input->memory_result)), + ConvertProbePtr(std::move(input->backlight_result)), + ConvertProbePtr(std::move(input->fan_result)), + ConvertProbePtr(std::move(input->stateful_partition_result)), + ConvertProbePtr(std::move(input->bluetooth_result)), + ConvertProbePtr(std::move(input->system_result_v2))); } } // namespace unchecked
diff --git a/ash/webui/telemetry_extension_ui/services/probe_service_converters.h b/ash/webui/telemetry_extension_ui/services/probe_service_converters.h index 3e04b2c..57a57ebe 100644 --- a/ash/webui/telemetry_extension_ui/services/probe_service_converters.h +++ b/ash/webui/telemetry_extension_ui/services/probe_service_converters.h
@@ -148,6 +148,12 @@ return output; } +template <class InputT> +auto ConvertProbePtr(InputT input) { + return (!input.is_null()) ? unchecked::UncheckedConvertPtr(std::move(input)) + : nullptr; +} + std::vector<cros_healthd::mojom::ProbeCategoryEnum> ConvertCategoryVector( const std::vector<health::mojom::ProbeCategoryEnum>& input);
diff --git a/ash/webui/telemetry_extension_ui/services/probe_service_converters_unittest.cc b/ash/webui/telemetry_extension_ui/services/probe_service_converters_unittest.cc index 853a11d..a493c9a5 100644 --- a/ash/webui/telemetry_extension_ui/services/probe_service_converters_unittest.cc +++ b/ash/webui/telemetry_extension_ui/services/probe_service_converters_unittest.cc
@@ -8,7 +8,6 @@ #include <vector> #include "ash/webui/telemetry_extension_ui/mojom/probe_service.mojom.h" -#include "ash/webui/telemetry_extension_ui/services/convert_ptr.h" #include "chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -24,12 +23,21 @@ namespace converters { +namespace cros_healthd = ::ash::cros_healthd; + // Note: in some tests we intentionally use New() with no arguments for // cros_healthd::mojom types, because there can be some fields that we don't // test yet. // Also, we intentionally use New() with arguments for health::mojom types to // let the compiler detect untested data members. +// Tests that |ConvertProbePtr| function returns nullptr if input is nullptr. +// ConvertProbePtr is a template, so we can test this function with any valid +// type. +TEST(ProbeServiceConverters, ConvertProbePtrTakesNullPtr) { + EXPECT_TRUE(ConvertProbePtr(cros_healthd::mojom::ProbeErrorPtr()).is_null()); +} + TEST(ProbeServiceConverters, ConvertCategoryVector) { const std::vector<health::mojom::ProbeCategoryEnum> kInput{ health::mojom::ProbeCategoryEnum::kUnknown, @@ -80,7 +88,7 @@ TEST(ProbeServiceConverters, ProbeErrorPtr) { constexpr char kMsg[] = "file not found"; - EXPECT_EQ(ConvertPtr(cros_healthd::mojom::ProbeError::New( + EXPECT_EQ(ConvertProbePtr(cros_healthd::mojom::ProbeError::New( cros_healthd::mojom::ErrorType::kFileReadError, kMsg)), health::mojom::ProbeError::New( health::mojom::ErrorType::kFileReadError, kMsg)); @@ -108,7 +116,7 @@ TEST(ProbeServiceConverters, UInt64ValuePtr) { constexpr uint64_t kValue = (1ULL << 63) + 3000000000; - EXPECT_EQ(ConvertPtr(cros_healthd::mojom::NullableUint64::New(kValue)), + EXPECT_EQ(ConvertProbePtr(cros_healthd::mojom::NullableUint64::New(kValue)), health::mojom::UInt64Value::New(kValue)); } @@ -147,7 +155,7 @@ } EXPECT_EQ( - ConvertPtr(std::move(input)), + ConvertProbePtr(std::move(input)), health::mojom::BatteryInfo::New( health::mojom::Int64Value::New(kCycleCount), health::mojom::DoubleValue::New(kVoltageNow), kVendor, kSerialNumber, @@ -160,15 +168,15 @@ } TEST(ProbeServiceConverters, BatteryResultPtrInfo) { - const auto output = - ConvertPtr(cros_healthd::mojom::BatteryResult::NewBatteryInfo(nullptr)); + const auto output = ConvertProbePtr( + cros_healthd::mojom::BatteryResult::NewBatteryInfo(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_battery_info()); } TEST(ProbeServiceConverters, BatteryResultPtrError) { const auto output = - ConvertPtr(cros_healthd::mojom::BatteryResult::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::BatteryResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -207,7 +215,7 @@ } EXPECT_EQ( - ConvertPtr(std::move(input)), + ConvertProbePtr(std::move(input)), health::mojom::NonRemovableBlockDeviceInfo::New( kPath, health::mojom::UInt64Value::New(kSize), kType, health::mojom::UInt32Value::New(kManufacturerId), kName, @@ -236,7 +244,7 @@ infos.push_back(std::move(info2)); } - const auto output = ConvertPtr( + const auto output = ConvertProbePtr( cros_healthd::mojom::NonRemovableBlockDeviceResult::NewBlockDeviceInfo( std::move(infos))); ASSERT_TRUE(output); @@ -247,8 +255,10 @@ } TEST(ProbeServiceConverters, NonRemovableBlockDeviceResultPtrError) { - const health::mojom::NonRemovableBlockDeviceResultPtr output = ConvertPtr( - cros_healthd::mojom::NonRemovableBlockDeviceResult::NewError(nullptr)); + const health::mojom::NonRemovableBlockDeviceResultPtr output = + ConvertProbePtr( + cros_healthd::mojom::NonRemovableBlockDeviceResult::NewError( + nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -265,21 +275,21 @@ input->product_serial_number = kSerialNumber; input->product_model_name = kModelName; - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::CachedVpdInfo::New(kFirstPowerDate, kSkuNumber, kSerialNumber, kModelName)); } TEST(ProbeServiceConverters, CachedVpdResultPtrInfo) { - const auto output = - ConvertPtr(cros_healthd::mojom::SystemResult::NewSystemInfo(nullptr)); + const auto output = ConvertProbePtr( + cros_healthd::mojom::SystemResult::NewSystemInfo(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_vpd_info()); } TEST(ProbeServiceConverters, CachedVpdResultPtrError) { const auto output = - ConvertPtr(cros_healthd::mojom::SystemResult::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::SystemResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -295,7 +305,7 @@ } EXPECT_EQ( - ConvertPtr(std::move(input)), + ConvertProbePtr(std::move(input)), health::mojom::CpuCStateInfo::New( kName, health::mojom::UInt64Value::New(kTimeInStateSinceLastBootUs))); } @@ -305,8 +315,8 @@ constexpr uint32_t kScalingMaxFrequencyKhz = (1 << 30) + 20000; constexpr uint32_t kScalingCurrentFrequencyKhz = (1 << 29) + 30000; - // Idle time cannot be tested with ConvertPtr, because it requires USER_HZ - // system constant to convert idle_time_user_hz to milliseconds. + // Idle time cannot be tested with ConvertPtr, because it requires + // USER_HZ system constant to convert idle_time_user_hz to milliseconds. constexpr uint32_t kIdleTime = 0; constexpr char kCpuCStateName[] = "C1"; @@ -329,7 +339,7 @@ expected_c_states.push_back(health::mojom::CpuCStateInfo::New( kCpuCStateName, health::mojom::UInt64Value::New(kCpuCStateTime))); - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::LogicalCpuInfo::New( health::mojom::UInt32Value::New(kMaxClockSpeedKhz), health::mojom::UInt32Value::New(kScalingMaxFrequencyKhz), @@ -358,8 +368,8 @@ constexpr uint32_t kScalingMaxFrequencyKhz = (1 << 30) + 22222; constexpr uint32_t kScalingCurrentFrequencyKhz = (1 << 29) + 33333; - // Idle time cannot be tested with ConvertPtr, because it requires USER_HZ - // system constant to convert idle_time_user_hz to milliseconds. + // Idle time cannot be tested with ConvertPtr, because it requires + // USER_HZ system constant to convert idle_time_user_hz to milliseconds. constexpr uint32_t kIdleTime = 0; auto input = cros_healthd::mojom::PhysicalCpuInfo::New(); @@ -382,7 +392,7 @@ health::mojom::UInt64Value::New(kIdleTime), std::vector<health::mojom::CpuCStateInfoPtr>{})); - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::PhysicalCpuInfo::New(kModelName, std::move(expected_infos))); } @@ -416,7 +426,7 @@ expected_infos.push_back(health::mojom::PhysicalCpuInfo::New( kModelName, std::vector<health::mojom::LogicalCpuInfoPtr>{})); - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::CpuInfo::New( health::mojom::UInt32Value::New(kNumTotalThreads), health::mojom::CpuArchitectureEnum::kArmv7l, @@ -425,14 +435,14 @@ TEST(ProbeServiceConverters, CpuResultPtrInfo) { const auto output = - ConvertPtr(cros_healthd::mojom::CpuResult::NewCpuInfo(nullptr)); + ConvertProbePtr(cros_healthd::mojom::CpuResult::NewCpuInfo(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_cpu_info()); } TEST(ProbeServiceConverters, CpuResultPtrError) { const auto output = - ConvertPtr(cros_healthd::mojom::CpuResult::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::CpuResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -445,20 +455,20 @@ input->posix = kPosix; input->region = kRegion; - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::TimezoneInfo::New(kPosix, kRegion)); } TEST(ProbeServiceConverters, TimezoneResultPtrInfo) { - const auto output = - ConvertPtr(cros_healthd::mojom::TimezoneResult::NewTimezoneInfo(nullptr)); + const auto output = ConvertProbePtr( + cros_healthd::mojom::TimezoneResult::NewTimezoneInfo(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_timezone_info()); } TEST(ProbeServiceConverters, TimezoneResultPtrError) { const auto output = - ConvertPtr(cros_healthd::mojom::TimezoneResult::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::TimezoneResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -475,7 +485,7 @@ input->available_memory_kib = kAvailableMemoryKib; input->page_faults_since_last_boot = kPageFaultsSinceLastBoot; - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::MemoryInfo::New( health::mojom::UInt32Value::New(kTotalMemoryKib), health::mojom::UInt32Value::New(kFreeMemoryKib), @@ -484,15 +494,15 @@ } TEST(ProbeServiceConverters, MemoryResultPtrInfo) { - const health::mojom::MemoryResultPtr output = - ConvertPtr(cros_healthd::mojom::MemoryResult::NewMemoryInfo(nullptr)); + const health::mojom::MemoryResultPtr output = ConvertProbePtr( + cros_healthd::mojom::MemoryResult::NewMemoryInfo(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_memory_info()); } TEST(ProbeServiceConverters, MemoryResultPtrError) { const health::mojom::MemoryResultPtr output = - ConvertPtr(cros_healthd::mojom::MemoryResult::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::MemoryResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -507,7 +517,7 @@ input->max_brightness = kMaxBrightness; input->brightness = kBrightness; - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::BacklightInfo::New( kPath, health::mojom::UInt32Value::New(kMaxBrightness), health::mojom::UInt32Value::New(kBrightness))); @@ -528,7 +538,7 @@ std::move(backlight_infos)); } - const auto output = ConvertPtr(std::move(input)); + const auto output = ConvertProbePtr(std::move(input)); ASSERT_TRUE(output); ASSERT_TRUE(output->is_backlight_info()); @@ -540,7 +550,7 @@ TEST(ProbeServiceConverters, BacklightResultPtrError) { const auto output = - ConvertPtr(cros_healthd::mojom::BacklightResult::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::BacklightResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -551,7 +561,7 @@ auto input = cros_healthd::mojom::FanInfo::New(); input->speed_rpm = kSpeedRpm; - const auto output = ConvertPtr(std::move(input)); + const auto output = ConvertProbePtr(std::move(input)); ASSERT_TRUE(output); EXPECT_EQ(output->speed_rpm, health::mojom::UInt32Value::New(kSpeedRpm)); } @@ -574,13 +584,13 @@ expected_fans.push_back( health::mojom::FanInfo::New(health::mojom::UInt32Value::New(kSpeedRpm))); - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::FanResult::NewFanInfo(std::move(expected_fans))); } TEST(ProbeServiceConverters, FanResultPtrError) { const auto output = - ConvertPtr(cros_healthd::mojom::FanResult::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::FanResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -595,21 +605,21 @@ input->available_space = kAvailableSpace; input->total_space = kTotalSpace; - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::StatefulPartitionInfo::New( health::mojom::UInt64Value::New(kRoundedAvailableSpace), health::mojom::UInt64Value::New(kTotalSpace))); } TEST(ProbeServiceConverters, StatefulPartitionResultPtrInfo) { - const auto output = ConvertPtr( + const auto output = ConvertProbePtr( cros_healthd::mojom::StatefulPartitionResult::NewPartitionInfo(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_partition_info()); } TEST(ProbeServiceConverters, StatefulPartitionResultPtrError) { - const auto output = ConvertPtr( + const auto output = ConvertProbePtr( cros_healthd::mojom::StatefulPartitionResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); @@ -629,7 +639,7 @@ input->num_connected_devices = kNumConnectedDevices; } - EXPECT_EQ(ConvertPtr(std::move(input)), + EXPECT_EQ(ConvertProbePtr(std::move(input)), health::mojom::BluetoothAdapterInfo::New( kName, kAddress, health::mojom::BoolValue::New(kPowered), health::mojom::UInt32Value::New(kNumConnectedDevices))); @@ -650,7 +660,7 @@ std::move(infos)); } - const auto output = ConvertPtr(std::move(input)); + const auto output = ConvertProbePtr(std::move(input)); ASSERT_TRUE(output); ASSERT_TRUE(output->is_bluetooth_adapter_info()); @@ -663,7 +673,7 @@ TEST(ProbeServiceConverters, BluetoothResultPtrError) { const auto output = - ConvertPtr(cros_healthd::mojom::BluetoothResult::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::BluetoothResult::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -674,7 +684,7 @@ auto input = cros_healthd::mojom::OsInfo::New(); input->oem_name = kOemName; - const auto output = ConvertPtr(std::move(input)); + const auto output = ConvertProbePtr(std::move(input)); ASSERT_TRUE(output); EXPECT_EQ(output->oem_name, kOemName); } @@ -694,7 +704,7 @@ std::move(system_info_v2)); } - const auto output = ConvertPtr(std::move(input)); + const auto output = ConvertProbePtr(std::move(input)); ASSERT_TRUE(output); ASSERT_TRUE(output->is_system_info()); @@ -705,7 +715,7 @@ TEST(ProbeServiceConverters, SystemResultPtrError) { const auto output = - ConvertPtr(cros_healthd::mojom::SystemResultV2::NewError(nullptr)); + ConvertProbePtr(cros_healthd::mojom::SystemResultV2::NewError(nullptr)); ASSERT_TRUE(output); EXPECT_TRUE(output->is_error()); } @@ -741,7 +751,7 @@ } EXPECT_EQ( - ConvertPtr(std::move(input)), + ConvertProbePtr(std::move(input)), health::mojom::TelemetryInfo::New( health::mojom::BatteryResult::NewBatteryInfo( health::mojom::BatteryInfo::New( @@ -780,7 +790,7 @@ } TEST(ProbeServiceConverters, TelemetryInfoPtrWithNullFields) { - EXPECT_EQ(ConvertPtr(cros_healthd::mojom::TelemetryInfo::New()), + EXPECT_EQ(ConvertProbePtr(cros_healthd::mojom::TelemetryInfo::New()), health::mojom::TelemetryInfo::New( health::mojom::BatteryResultPtr(nullptr), health::mojom::NonRemovableBlockDeviceResultPtr(nullptr),
diff --git a/ash/webui/telemetry_extension_ui/services/probe_service_unittest.cc b/ash/webui/telemetry_extension_ui/services/probe_service_unittest.cc index 0c51b99c..d58a5d8 100644 --- a/ash/webui/telemetry_extension_ui/services/probe_service_unittest.cc +++ b/ash/webui/telemetry_extension_ui/services/probe_service_unittest.cc
@@ -18,6 +18,10 @@ namespace ash { +namespace { +namespace cros_healthd = ::ash::cros_healthd; +} // namespace + class ProbeServiceTest : public testing::Test { public: void SetUp() override {
diff --git a/base/containers/contiguous_iterator.h b/base/containers/contiguous_iterator.h index 84502c5..4559fae 100644 --- a/base/containers/contiguous_iterator.h +++ b/base/containers/contiguous_iterator.h
@@ -18,7 +18,10 @@ namespace internal { template <typename T> -struct PointsToObject : std::is_object<iter_value_t<T>> {}; +struct PointsToObject : std::true_type {}; +// std::iter_value_t is not defined for `T*` where T is not an object type. +template <typename T> +struct PointsToObject<T*> : std::is_object<T> {}; // A pointer is a contiguous iterator. // Reference: https://wg21.link/iterator.traits#5 @@ -74,15 +77,16 @@ // Check that the iterator points to an actual object, and is one of the // iterator types mentioned above. +template <typename T, bool B = PointsToObject<T>::value> +struct IsContiguousIteratorImpl : std::false_type {}; template <typename T> -struct IsContiguousIteratorImpl - : std::conjunction<PointsToObject<T>, - std::disjunction<IsPointer<T>, - IsStringIter<T>, - IsArrayIter<T>, - IsVectorIter<T>, - IsValueArrayIter<T>, - IsCheckedContiguousIter<T>>> {}; +struct IsContiguousIteratorImpl<T, true> + : std::disjunction<IsPointer<T>, + IsStringIter<T>, + IsArrayIter<T>, + IsVectorIter<T>, + IsValueArrayIter<T>, + IsCheckedContiguousIter<T>> {}; } // namespace internal
diff --git a/base/template_util.h b/base/template_util.h index 7bd13c43..c3b4711b 100644 --- a/base/template_util.h +++ b/base/template_util.h
@@ -113,8 +113,28 @@ // // Reference: https://wg21.link/readable.traits#2 template <typename Iter> -using iter_value_t = - typename std::iterator_traits<remove_cvref_t<Iter>>::value_type; +struct IterValueImpl { + using value_type = typename std::iterator_traits<Iter>::value_type; +}; + +template <typename T, bool Cond = false> +struct IterValuePointerImpl { + // The `iterator_traits<T*>::value_type` member is not defined if T is not an + // object in C++20. +}; +template <typename T> +struct IterValuePointerImpl<T*, true> { + using value_type = typename std::iterator_traits<T*>::value_type; +}; + +template <typename T> +struct IterValueImpl<T*> { + using value_type = + typename IterValuePointerImpl<T*, std::is_object_v<T>>::value_type; +}; + +template <typename Iter> +using iter_value_t = typename IterValueImpl<remove_cvref_t<Iter>>::value_type; // Simplified implementation of C++20's std::iter_reference_t. // As opposed to std::iter_reference_t, this implementation does not restrict
diff --git a/build/android/gyp/bundletool.py b/build/android/gyp/bundletool.py index cfcc1c44..269b85d 100755 --- a/build/android/gyp/bundletool.py +++ b/build/android/gyp/bundletool.py
@@ -10,6 +10,7 @@ import logging import os +import shlex import sys from util import build_utils @@ -30,7 +31,7 @@ cmd = build_utils.JavaCmd(verify, xmx='4G') cmd += ['-jar', BUNDLETOOL_JAR_PATH] cmd += args - logging.debug(' '.join(cmd)) + logging.debug('%s', shlex.join(cmd)) return build_utils.CheckOutput( cmd, print_stdout=print_stdout,
diff --git a/build/android/pylib/utils/app_bundle_utils.py b/build/android/pylib/utils/app_bundle_utils.py index 6094c2f..28b63f9 100644 --- a/build/android/pylib/utils/app_bundle_utils.py +++ b/build/android/pylib/utils/app_bundle_utils.py
@@ -5,6 +5,7 @@ import json import logging import os +import pathlib import re import shutil import sys @@ -17,11 +18,11 @@ from util import resource_utils import bundletool -# List of valid modes for GenerateBundleApks() -BUILD_APKS_MODES = ('default', 'universal', 'system', 'system_compressed') +# "system_apks" is "default", but with locale list and compressed dex. +_SYSTEM_MODES = ('system', 'system_apks') +BUILD_APKS_MODES = _SYSTEM_MODES + ('default', 'universal') OPTIMIZE_FOR_OPTIONS = ('ABI', 'SCREEN_DENSITY', 'LANGUAGE', 'TEXTURE_COMPRESSION_FORMAT') -_SYSTEM_MODES = ('system_compressed', 'system') _ALL_ABIS = ['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'] @@ -143,7 +144,11 @@ if mode not in BUILD_APKS_MODES: raise Exception('Invalid mode parameter %s (should be in %s)' % (mode, BUILD_APKS_MODES)) - cmd_args += ['--mode=' + mode] + if mode != 'system_apks': + cmd_args += ['--mode=' + mode] + else: + # Specify --optimize-for to prevent language splits being created. + cmd_args += ['--optimize-for=device_tier'] if optimize_for: if optimize_for not in OPTIMIZE_FOR_OPTIONS: @@ -153,10 +158,11 @@ cmd_args += ['--optimize-for=' + optimize_for] if device_spec: - spec_file = os.path.join(tmp_dir, 'device.json') - with open(spec_file, 'w') as f: - json.dump(device_spec, f) - cmd_args += ['--device-spec=' + spec_file] + data = json.dumps(device_spec) + logging.debug('Device Spec: %s', data) + spec_file = pathlib.Path(tmp_dir) / 'device.json' + spec_file.write_text(data) + cmd_args += ['--device-spec=' + str(spec_file)] bundletool.RunBundleTool(cmd_args)
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 694ad07..c6f71f92 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -8.20220503.2.1 +8.20220504.1.1
diff --git a/chrome/VERSION b/chrome/VERSION index 2bdcec2..c72704af 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=103 MINOR=0 -BUILD=5043 +BUILD=5044 PATCH=0
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/JsFlowIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/JsFlowIntegrationTest.java index 80e7606f..943f982 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/JsFlowIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/JsFlowIntegrationTest.java
@@ -16,7 +16,7 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.iterableWithSize; -import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_POLLING_INTERVAL; +import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.checkElementExists; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.startAutofillAssistant; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.tapElement; @@ -38,7 +38,6 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantTestService.ScriptsReturnMode; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; @@ -244,14 +243,15 @@ private ActionProto toJsFlowAction(List<ActionProto> actions) { assert (!actions.isEmpty()); StringBuilder jsFlow = new StringBuilder(); - for (int i = 0; i < actions.size(); i++) { - jsFlow.append("[client_status, value] = await runNativeAction(") - .append(actions.get(i).getActionInfoCase().getNumber()) + for (ActionProto action : actions) { + jsFlow.append("[clientStatus, value] = await runNativeAction(") + .append(action.getActionInfoCase().getNumber()) .append(", '") - .append(Base64.encodeToString(getActionBytes(actions.get(i)), Base64.NO_WRAP)) - .append("');\nif (client_status != 2) { return {status:client_status}; }\n"); + .append(Base64.encodeToString(getActionBytes(action), Base64.NO_WRAP)) + .append("');\n") + .append("if (clientStatus != 2) return {status: clientStatus};\n"); } - jsFlow.append("return {status:client_status};"); + jsFlow.append("return {status: 2};"); return ActionProto.newBuilder() .setJsFlow(JsFlowProto.newBuilder().setJsFlow(jsFlow.toString())) .build(); @@ -278,8 +278,8 @@ AutofillAssistantTestScript script = new AutofillAssistantTestScript(TEST_SCRIPT, list); runScript(script); - waitUntilViewMatchesCondition(withText("After JS flow"), isCompletelyDisplayed()); waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "touch_area_one")); + waitUntilViewMatchesCondition(withText("After JS flow"), isCompletelyDisplayed()); } @Test @@ -317,7 +317,6 @@ @Test @MediumTest - @DisabledTest(message = "crbug.com/1307549") public void stopFlowFromJs() throws Exception { ArrayList<ActionProto> nestedActions = new ArrayList<>(); nestedActions.add(ActionProto.newBuilder() @@ -346,12 +345,11 @@ waitUntilViewMatchesCondition(withText("Stop"), isCompletelyDisplayed()); onView(withText("Stop")).perform(click()); waitUntilViewAssertionTrue( - withId(R.id.autofill_assistant), doesNotExist(), DEFAULT_POLLING_INTERVAL); + withId(R.id.autofill_assistant), doesNotExist(), DEFAULT_MAX_TIME_TO_POLL); } @Test @MediumTest - @DisabledTest(message = "crbug.com/1307549") public void runInterruptDuringFlow() throws Exception { ArrayList<AutofillAssistantTestScript> scripts = new ArrayList<>(); ArrayList<ActionProto> nestedActions = new ArrayList<>();
diff --git a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java index cf65b19..0661aae 100644 --- a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java +++ b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
@@ -155,7 +155,7 @@ } @CalledByNative - public void getAssertion(byte[] serializedParams) { + public void getAssertion(byte[] serializedParams, byte[] tunnelId) { PublicKeyCredentialRequestOptions params = PublicKeyCredentialRequestOptions.deserialize(ByteBuffer.wrap(serializedParams)); @@ -164,8 +164,8 @@ Fido2ApiCall.PendingIntentResult result = new Fido2ApiCall.PendingIntentResult(call); args.writeStrongBinder(result); args.writeInt(1); // This indicates that the following options are present. - Fido2Api.appendBrowserGetAssertionOptionsToParcel( - params, Uri.parse("https://" + params.relyingPartyId), params.challenge, args); + Fido2Api.appendBrowserGetAssertionOptionsToParcel(params, + Uri.parse("https://" + params.relyingPartyId), params.challenge, tunnelId, args); Task<PendingIntent> task = call.run( Fido2ApiCall.METHOD_BROWSER_SIGN, Fido2ApiCall.TRANSACTION_SIGN, args, result);
diff --git a/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc b/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc index af330a68..04a8bcf 100644 --- a/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc +++ b/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc
@@ -421,9 +421,15 @@ std::vector<uint8_t> params_bytes = blink::mojom::PublicKeyCredentialRequestOptions::Serialize(¶ms); + ScopedJavaLocalRef<jbyteArray> tunnel_id; + if (global_data.server_link_tunnel_id.has_value()) { + tunnel_id = ToJavaByteArray(env_, *global_data.server_link_tunnel_id); + } + RecordEvent(&global_data, CableV2MobileEvent::kGetAssertionStarted); Java_CableAuthenticator_getAssertion(env_, cable_authenticator_, - ToJavaByteArray(env_, params_bytes)); + ToJavaByteArray(env_, params_bytes), + tunnel_id); } void OnStatus(Status status) override {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 05935eb..7aee7449 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -346,6 +346,9 @@ * Whether the StartSurface is shown when Chrome is launched. */ private boolean mOverviewShownOnStart; + // Whether the activity is staring from a resumption. False if the activity is starting from + // onCreate(), a cold startup. + private boolean mFromResumption; private NextTabPolicySupplier mNextTabPolicySupplier; @@ -979,6 +982,17 @@ @Override public void onResumeWithNative() { + // On warm startup, call setInitialOverviewState in onResume() instead of onStart(). This is + // because onResume() is guaranteed to called after onNewIntent() and thus have the updated + // Intent which is used by shouldShowOverviewPageOnStart(). See https://crbug.com/1321607. + if (mFromResumption) { + setInitialOverviewState(); + } else { + // Set mFromResumption to be true to skip the call of setInitialOverviewState() in + // onStart() when the next time onStart() is called, since it is no longer a cold start. + mFromResumption = true; + } + super.onResumeWithNative(); IncognitoStartup.onResumeWithNative( @@ -1031,9 +1045,11 @@ mMainIntentMetrics.logLaunchBehavior(); super.onStartWithNative(); - // Don't call setInitialOverviewState if we're waiting for the tab's creation or we risk - // showing a glimpse of the tab selector during start up. - if (!mPendingInitialTabCreation) { + // Don't call setInitialOverviewState if 1) we're waiting for the tab's creation or we risk + // showing a glimpse of the tab selector during start up. 2) on warm startup from an + // resumption. Defer it to onResumeWitheNative() since it needs to check the latest Intent + // which is only guaranteed to be updated onResume() if onNewIntent() is called. + if (!mPendingInitialTabCreation && !mFromResumption) { setInitialOverviewState(); } @@ -1781,7 +1797,7 @@ * an LayoutManagerChrome object, add overview mode observer and so on. */ private void prepareToShowStartPagePreNative() { - assert isInstantStartEnabled() && !hadWarmStart(); + assert isInstantStartEnabled() && !hadWarmStart() && !mFromResumption; try (TraceEvent e = TraceEvent.scoped("ChromeTabbedActivity.prepareToShowStartPagePreNative")) { setupCompositorContentPreNativeForPhone();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDownloadObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDownloadObserver.java index b43a51c5..6d0c162 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDownloadObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDownloadObserver.java
@@ -53,7 +53,7 @@ if (ChromeFeatureList.isEnabled(ChromeFeatureList.CCT_NEW_DOWNLOAD_TAB) && navigation.isDownload()) { DownloadInterstitialCoordinator coordinator = - DownloadInterstitialCoordinatorFactory.create(tab.getContext(), + DownloadInterstitialCoordinatorFactory.create(tab::getContext, tab.getOriginalUrl().getSpec(), tab.getWindowAndroid()); NewDownloadTab.from(tab, coordinator, mActivity).show(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java index d470f16..73b5060 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
@@ -546,6 +546,16 @@ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) protected void closeInstance(int instanceId, int taskId) { removeInstanceInfo(instanceId); + TabModelSelector selector = + TabWindowManagerSingleton.getInstance().getTabModelSelectorById(instanceId); + if (selector != null) { + // Close all tabs as the window is closing. This ensures the tabs are added to the + // recent tabs page. + // + // TODO(crbug/1304883): This only works for windows with live activities. It is + // non-trivial to add recent tab entries without an active {@link Tab} instance. + selector.closeAllTabs(/*uponExit=*/true); + } mTabModelOrchestratorSupplier.get().cleanupInstance(instanceId); Activity activity = getActivityById(instanceId); if (activity != null) activity.finishAndRemoveTask();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java index ba36358..f677f32 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java
@@ -14,7 +14,10 @@ import android.text.TextUtils; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.Button; import android.widget.FrameLayout; +import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; @@ -68,6 +71,7 @@ private ScrollView mCustomScrollView; private TextView mCustomTextView1; private TextView mCustomTextView2; + private RelativeLayout mCustomButtonBar; @Rule public RenderTestRule mRenderTestRule = @@ -108,6 +112,15 @@ mCustomTextView1.setId(R.id.test_view_one); mCustomTextView2 = new TextView(activity); mCustomTextView2.setId(R.id.test_view_two); + + mCustomButtonBar = new RelativeLayout(activity); + mCustomButtonBar.setId(R.id.test_button_bar_one); + Button button = new Button(activity); + button.setText(R.string.ok); + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); + mCustomButtonBar.addView(button, params); }); } @@ -223,6 +236,17 @@ @Test @MediumTest @Feature({"ModalDialog", "RenderTest"}) + public void testRender_CustomButtonBarView() throws IOException { + setUpViews(R.style.ThemeOverlay_BrowserUI_ModalDialog_TextPrimaryButton); + createModel( + mModelBuilder.with(ModalDialogProperties.CUSTOM_BUTTON_BAR_VIEW, mCustomButtonBar) + .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, mResources, R.string.ok)); + mRenderTestRule.render(mModalDialogView, "custom_button_bar_view"); + } + + @Test + @MediumTest + @Feature({"ModalDialog", "RenderTest"}) public void testRender_FooterMessage() throws IOException { setUpViews(R.style.ThemeOverlay_BrowserUI_ModalDialog_TextPrimaryButton); createModel(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java index 8f2b067..f9b130f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
@@ -304,7 +304,6 @@ public void clearServerData() { mFakeServerHelper.clearServerData(); - SyncTestUtil.triggerSync(); CriteriaHelper.pollUiThread(() -> { return !SyncService.get().isSyncRequested(); }, SyncTestUtil.TIMEOUT_MS, SyncTestUtil.INTERVAL_MS);
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index c3b58dc..f3ee8ab 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -5652,6 +5652,9 @@ <message name="IDS_PASSWORD_GENERATION_SUGGESTION" desc="Text shown next to a generated password describing it as a suggestion."> Use suggested password </message> + <message name="IDS_PASSWORD_GENERATION_SUGGESTION_GPM" desc="Text shown next to a generated password describing it as a suggestion."> + Use strong password + </message> <message name="IDS_PASSWORD_GENERATION_EDITING_SUGGESTION" desc="Notification text next to the generated password assuring the user that the password has been saved."> Saved password </message>
diff --git a/chrome/app/generated_resources_grd/IDS_PASSWORD_GENERATION_SUGGESTION_GPM.png.sha1 b/chrome/app/generated_resources_grd/IDS_PASSWORD_GENERATION_SUGGESTION_GPM.png.sha1 new file mode 100644 index 0000000..b8a0dac7 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_PASSWORD_GENERATION_SUGGESTION_GPM.png.sha1
@@ -0,0 +1 @@ +fbdb5b10a9f076aa3a411f864040cfb346f56d47 \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index b495871..39a3930 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -176,6 +176,7 @@ <translation id="5398878173008909840">Chromium'um yeni versiyası əlçatandır.</translation> <translation id="5427571867875391349">Chromium'u defolt brauzer təyin edin</translation> <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation> +<translation id="5473971139929175403">Chromium düzgün işləməyə bilər, çünki daha Linux sistemi üzərində dəstəklənmir</translation> <translation id="5480860683791598150">Chromium məkanı bu saytla paylaşmaq üçün ona giriş tələb edir</translation> <translation id="5487574057737591516">Məxfiliyinizi qorumaq üçün 4 həftədən köhnə maraqlarınızı avtomatik silirik. Baxmağa davam etdikcə, maraq siyahıda yenidən görünə bilər. Chromium səhv anlasa və ya müəyyən reklamları görmək istəmirsinizsə, marağı silə bilərsiniz.</translation> <translation id="549669000822060376">Chromium'um ən son sistem güncəlləşmələrini quraşdırmasını gözləyin.</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 56a02743..7307587 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -178,6 +178,7 @@ <translation id="5398878173008909840">There is a new version of Chromium available.</translation> <translation id="5427571867875391349">Set Chromium as your default browser</translation> <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation> +<translation id="5473971139929175403">Chromium may not function correctly because it is no longer supported on this Linux distribution</translation> <translation id="5480860683791598150">Chromium needs access to your location to share your location with this site</translation> <translation id="5487574057737591516">To protect your privacy, we auto-delete your interests that are older than four weeks. As you keep browsing, an interest might appear on the list again. And if Chromium gets it wrong or you don't want to see certain ads, you can remove an interest.</translation> <translation id="549669000822060376">Please wait while Chromium installs the latest system updates.</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb index 240f1f87..e1cf9f9 100644 --- a/chrome/app/resources/chromium_strings_ka.xtb +++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -178,6 +178,7 @@ <translation id="5398878173008909840">ხელმისაწვდომია Chromium-ის ახალი ვერსია.</translation> <translation id="5427571867875391349">დააყენეთ Chromium ნაგულისხმევ ბრაუზერად</translation> <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> — Chromium Beta</translation> +<translation id="5473971139929175403">Chromium-მა შეიძლება არასწორად იმუშაოს, რადგან ის აღარ არის მხარდაჭერილი ამ Linux დისტრიბუტივზე</translation> <translation id="5480860683791598150">Chromium საჭიროებს თქვენს მდებარეობაზე წვდომის ნებართვას ამ საიტისთვის გასაზიარებლად</translation> <translation id="5487574057737591516">თქვენი კონფიდენციალურობის დაცვის მიზნით, ჩვენ ავტომატურად ვშლით თქვენს ინტერესებს, რომლებიც 4 კვირაზე ძველია. თქვენ მიერ ვების დათვალიერების პარალელურად, ესა თუ ეს ინტერესი შეიძლება ხელახლა გამოჩნდეს სიაში. თუ Chromium შეცდომით გამოიცნობს თქვენს ინტერესს, ან რომელიმე ტიპის რეკლამის ნახვას არ მოისურვებთ, ინტერესის წაშლის საშუალება გექნებათ.</translation> <translation id="549669000822060376">დაელოდეთ, სანამ Chromium დააინსტალირებს სისტემის უახლეს განახლებებს.</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index 5c80d856..3f34cf4 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -178,6 +178,7 @@ <translation id="5398878173008909840">ມີ Chromium ລຸ້ນໃໝ່ຢູ່.</translation> <translation id="5427571867875391349">ຕັ້ງ Chromium ເປັນບຣາວເຊີມາດຕະຖານຂອງທ່ານ</translation> <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation> +<translation id="5473971139929175403">Chromium ອາດເຮັດວຽກໄດ້ບໍ່ຖືກຕ້ອງເນື່ອງຈາກ Linux distribution ນີ້ບໍ່ຮອງຮັບມັນອີກຕໍ່ໄປແລ້ວ.</translation> <translation id="5480860683791598150">Chromium ຕ້ອງການເຂົ້າເຖິງສະຖານທີ່ຂອງທ່ານເພື່ອແບ່ງປັນສະຖານທີ່ຂອງທ່ານກັບເວັບໄຊນີ້</translation> <translation id="5487574057737591516">ເພື່ອປົກປ້ອງຄວາມເປັນສ່ວນຕົວຂອງທ່ານ, ພວກເຮົາຈະລຶບຄວາມສົນໃຈຂອງທ່ານທີ່ເກົ່າກວ່າ 4 ອາທິດອອກໂດຍອັດຕະໂນມັດ. ໃນເວລາທີ່ທ່ານສືບຕໍ່ການທ່ອງເວັບ, ຄວາມສົນໃຈອາດປາກົດຢູ່ລາຍຊື່ຄືນໃໝ່. ແລະ ຫາກ Chromium ເຂົ້າໃຈຜິດ ຫຼື ທ່ານບໍ່ຕ້ອງການເຫັນໂຄສະນາບາງຢ່າງ, ທ່ານສາມາດລຶບຄວາມສົນໃຈໃດໜຶ່ງອອກໄດ້.</translation> <translation id="549669000822060376">ກະລຸນາລໍຖ້າໃນຂະນະທີ່ Chromium ຕິດຕັ້ງການອັບເດດລະບົບຫລ້າສຸດ.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index a390458..d7e1250 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -178,6 +178,7 @@ <translation id="5398878173008909840">Pasiekiama nauja „Chromium“ versija.</translation> <translation id="5427571867875391349">Nustatyti „Chromium“ kaip numatytąją naršyklę</translation> <translation id="5438241569118040789">„<ph name="PAGE_TITLE" />“ – „Chromium Beta“</translation> +<translation id="5473971139929175403">„Chromium“ gali tinkamai neveikti, nes ji nebepalaikoma naudojant šią „Linux“ versiją</translation> <translation id="5480860683791598150">„Chromium“ reikia leidimo, kad galėtų naudoti jūsų vietovės informaciją ir bendrinti ją su šia svetaine</translation> <translation id="5487574057737591516">Siekdami apsaugoti jūsų privatumą, automatiškai ištriname senesnius nei keturių savaičių pomėgius. Jums naršant toliau, pomėgiai vėl gali atsirasti sąraše. Ir jei „Chromium“ sprendimas atrodo neteisingas arba nenorite matyti tam tikrų skelbimų, pomėgį galite pašalinti.</translation> <translation id="549669000822060376">Palaukite, kol „Chromium“ įdiegs naujausius sistemos naujinius.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index 90e1576..c8f9195 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -176,6 +176,7 @@ <translation id="5398878173008909840">Ашиглах боломжтой Chromium-ийн шинэ хувилбар байна.</translation> <translation id="5427571867875391349">Chromium-ыг өөрийн анхдагч веб хөтөч болгон тохируулах</translation> <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Бета</translation> +<translation id="5473971139929175403">Үүнийг Linux дистрибьютер дээр цаашид дэмжихгүй тул Chromium буруу ажиллаж болзошгүй</translation> <translation id="5480860683791598150">Таны байршлыг энэ сайттай хуваалцахын тулд Chromium-д таны байршилд хандах зөвшөөрөл шаардлагатай</translation> <translation id="5487574057737591516">Таны нууцлалыг хамгаалахын тулд бид таны 4 долоо хоногоос дээш хугацаатай сонирхлыг автоматаар устгадаг. Таныг үргэлжлүүлэн үзэх үед сонирхол нь жагсаалтад дахин харагдаж магадгүй. Мөн Chromium үүнийг буруу тооцоолсон эсвэл та тодорхой зарыг харахыг хүсэхгүй байвал та сонирхлыг хасах боломжтой.</translation> <translation id="549669000822060376">Chromium нь хамгийн сүүлийн үеийн системийн шинэчлэлтүүдийг суулгаж байгаа тул түр хүлээнэ үү.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index eca6bc0..bda6509 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -884,6 +884,7 @@ <translation id="1823098433522728610">Hierdie dokument het sensitiewe inhoud.</translation> <translation id="18245044880483936">Rugsteundata sal nie deel vorm van jou kind se Drive-bergingkwota nie.</translation> <translation id="1825565032302550710">Poort moet tussen 1024 en 65535 wees</translation> +<translation id="182577151972096764">resepte wat onlangs bekyk is</translation> <translation id="1826192255355608658">Sinkroniseer jou Chrome-blaaierboekmerke, -wagwoorde, -geskiedenis en meer</translation> <translation id="1826516787628120939">Gaan tans na</translation> <translation id="1827738518074806965">Kunsgalery</translation> @@ -1318,6 +1319,7 @@ <translation id="2241053333139545397">Lees en verander jou data op 'n hele aantal webwerwe</translation> <translation id="2241634353105152135">Net een keer</translation> <translation id="2242687258748107519">Lêerinligting</translation> +<translation id="2246129643805925002">Jou <ph name="DEVICE_TYPE" /> dateer op die agtergrond op om vir jou die jongste kenmerke en sekuriteitverbeteringe te gee. Jy kan opdateringvoorkeure in Instellings kontroleer.</translation> <translation id="2246549592927364792">Kry prentbeskrywings van Google af?</translation> <translation id="2247738527273549923">Jou organisasie bestuur jou toestel</translation> <translation id="2249111429176737533">Maak as oortjievenster oop</translation> @@ -1610,6 +1612,7 @@ <translation id="249113932447298600">Jammer, die toestel <ph name="DEVICE_LABEL" /> word nie op hierdie tydstip gesteun nie.</translation> <translation id="2492461744635776704">Berei tans sertifikaatondertekeningversoek voor</translation> <translation id="2493126929778606526">Jou beste foto's, outomaties gekies</translation> +<translation id="2495524171012645395">Resepte wat onlangs bekyk is</translation> <translation id="2496180316473517155">Blaaigeskiedenis</translation> <translation id="2497229222757901769">Muisspoed</translation> <translation id="2497852260688568942">Jou administrateur het sinkronisering gedeaktiveer</translation> @@ -3429,6 +3432,7 @@ <translation id="4289732974614035569">Kies 'n PIN</translation> <translation id="4290791284969893584">Take wat jy begin het, sal dalk nie klaarmaak as jy 'n bladsy toemaak nie</translation> <translation id="4291265871880246274">Aanmelddialoog</translation> +<translation id="429234155571566255">hierdie resepte wat onlangs bekyk is</translation> <translation id="4295072614469448764">Program is in jou terminaal beskikbaar. Daar is dalk ook 'n ikoon in jou Lanseerder.</translation> <translation id="4295979599050707005">Meld asseblief weer aan om te bevestig dat jou rekening <ph name="USER_EMAIL" /> in webwerwe, programme en uitbreidings in Chrome en Google Play gebruik kan word. Jy kan hierdie rekening ook verwyder. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Herbegin en stel terug</translation> @@ -3489,6 +3493,7 @@ <translation id="435527878592612277">Kies jou foto</translation> <translation id="4358302248024731679">Googlers kan bykomende Bluetooth-loglêers by hul terugvoerverslae insluit om Bluetooth-kwessies beter te diagnoseer. Wanneer hierdie opsie gemerk is, sal jou verslag btsnoop- en HCI-loglêers uit jou huidige sessie insluit wat skoongemaak is om soveel persoonlik identifiseerbare inligting moontlik te verwyder. Toegang tot hierdie loglêers sal tot bestuurders van die Chrome-bedryfstelselprodukgroep in Listnr beperk word. Loglêers sal ná 90 dae permanent uitgevee word.</translation> <translation id="4358313196493694334">Stabiliseer klikligging</translation> +<translation id="4358643842961018282">Jou toestel is op datum</translation> <translation id="4359408040881008151">Vanweë afhanklike uitbreiding(s) geïnstalleer.</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">Die private sleutel vir hierdie kliëntsertifikaat ontbreek of is ongeldig</translation> @@ -4783,7 +4788,6 @@ <translation id="5658415415603568799">Vir bykomende sekuriteit sal Smart Lock jou ná 20 uur vra om jou wagwoord in te voer.</translation> <translation id="5659593005791499971">E-pos</translation> <translation id="5659833766619490117">Hierdie bladsy kon nie vertaal word nie</translation> -<translation id="566097169318652001">Jou toestel sal dalk nie meer reg werk nie en jy kan veiligheid- en werkverrigtingkwessies ervaar. Sleutelkenmerke in jou programme kan dalk ophou werk wanneer hulle verouderd raak en jy sal nie meer die reg hê om wetlike eise te maak nie.</translation> <translation id="5662513737565158057">Verander hoe Linux-programme sal werk.</translation> <translation id="5667293444945855280">Wanware</translation> <translation id="5667546120811588575">Stel tans Google Play op …</translation> @@ -6102,7 +6106,6 @@ <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> -<translation id="6974609594866392343">Vanlyn demonstrasiemodus</translation> <translation id="697508444536771064">Skakel Linux af</translation> <translation id="6978121630131642226">Soekenjins</translation> <translation id="6979044105893951891">Begin en verlaat bestuurde gastesessies</translation> @@ -7122,6 +7125,7 @@ <translation id="7981313251711023384">Laai bladsye vooraf om vinniger te blaai en te soek</translation> <translation id="798145602633458219">Heg hierdie voorstel <ph name="SUGGESTION_NAME" /> aan soekkassie</translation> <translation id="7981662863948574132">Wys toestel-EID en QR-kodeopspringer</translation> +<translation id="7981670705071137488">Sagteware-opdaterings sal daarna op die agtergrond gebeur. Jy kan opdateringvoorkeure in Instellings kontroleer.</translation> <translation id="7982083145464587921">Herbegin asseblief jou toestel om hierdie fout reg te stel.</translation> <translation id="7982789257301363584">Netwerk</translation> <translation id="7984068253310542383">Weerspieël <ph name="DISPLAY_NAME" /></translation> @@ -7365,6 +7369,7 @@ <translation id="8214489666383623925">Maak lêer oop …</translation> <translation id="8215129063232901118">Kry van jou <ph name="DEVICE_TYPE" /> af toegang tot jou foon se vermoëns</translation> <translation id="8217399928341212914">Hou aan om outomatiese aflaaie van veelvuldige lêers te blokkeer</translation> +<translation id="822050276545350872">Van nou af word geen wagtydperk vereis nie</translation> <translation id="8221491193165283816">Jy blokkeer gewoonlik kennisgewings. Klik hier sodat dié werf jou in kennis kan stel.</translation> <translation id="822347941086490485">Soek tans HID-toestelle …</translation> <translation id="8225046344534779393">Gaan internetverbinding na</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 57bbc1da..2b7c4a3 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -4778,7 +4778,6 @@ <translation id="5658415415603568799">ለተጨማሪ ደህንነት ሲባል Smart Lock ከ20 ሰዓቶች በኋላ የእርስዎን የይለፍ ቃል እንዲያስገቡ ይጠይቀዎታል።</translation> <translation id="5659593005791499971">ኢሜይል</translation> <translation id="5659833766619490117">ይህ ገጽ ሊተረጎም አልቻለም</translation> -<translation id="566097169318652001">መሣሪያዎ ከአንግዲህ በትክክል ላይሰራ ይችላል፣ እና የደህንነት እና የአፈጻጸም ችግሮች ሊያጋጥሙዎት ይችላሉ። በእርስዎ መተግበሪያዎች ውስጥ ያሉ ቁልፍ ባህሪያት ጊዜ ያለፈባቸው ሲሆኑ መስራት ሊያቆሙ ይችላሉ እና እርስዎ ህጋዊ የይገባኛል ጥያቄ የማቅረብ መብትዎን ያጣሉ።</translation> <translation id="5662513737565158057">የLinux መተግበሪያዎች እንዴት እንደሚሰሩ ይቀይሩ።</translation> <translation id="5667293444945855280">ማልዌር</translation> <translation id="5667546120811588575">Google Playን በማዋቀር ላይ...</translation> @@ -5632,6 +5631,7 @@ <translation id="6520876759015997832">የፍለጋ ውጤት <ph name="LIST_POSITION" /> ከ<ph name="LIST_SIZE" />፦ <ph name="SEARCH_RESULT_TEXT" />. ወደ ክፍሉ ለመዳሰስ አስገባን ይጫኑ።</translation> <translation id="6521214596282732365">እርስዎ በመስመር ላይ ንድፍ እና ግራፊክ መሣሪያዎች ከፍተኛ ጥራት ያለውን ይዘት መፍጠር እንዲችሉ ጣቢያዎች አብዛኛው ጊዜ የእርስዎን ቅርጸ-ቁምፊዎች ይጠቀማሉ</translation> <translation id="6523303810310758032">የአሰሳ ታሪክዎን ሲሰርዙ - ሁሉንም ወይም ለአንድ የተወሰነ ጣቢያ - እንዲሁም ተዛማጅ የመለኪያ መረጃን ይሰርዛሉ። <ph name="BEGIN_LINK" />የእርስዎን የአሰሳ ታሪክ<ph name="END_LINK" /> ይመልከቱ</translation> +<translation id="6523574494641144162">Google የይለፍ ቃል አስተዳዳሪ እነዚህን የይለፍ ቃላት በእርስዎ Google መለያ ውስጥ ሊያስቀምጣቸው አልቻለም። በዚህ መሣሪያ ላይ ሊያስቀምጧቸው ይችላሉ።</translation> <translation id="6524735478670290456">ይህን ውሂብ እንዴት እንደምንጠቀምበት፦</translation> <translation id="652492607360843641">ወደ <ph name="NETWORK_TYPE" /> አውታረ መረብ ተገናኝተዋል።</translation> <translation id="6527303717912515753">አጋራ</translation> @@ -5938,6 +5938,7 @@ <translation id="6818198425579322765">የሚተረጎመው የገጽ ቋንቋ</translation> <translation id="6818547713623251698">የስልክዎን ፎቶዎች፣ ሚዲያዎች፣ ማሳወቂያዎች እና መተግበሪያዎች ይመልከቱ</translation> <translation id="6818802132960437751">አብሮገነብ የቫይረስ መከላከያ</translation> +<translation id="6818920801736417483">የይለፍ ቃላት ይቀመጡ?</translation> <translation id="6823174134746916417">የመዳሰሻ ሰሌዳ ለጠቅታ-መታ-ማድረግ</translation> <translation id="6824564591481349393">&ኢሜይል አድራሻ ቅዳ</translation> <translation id="6824584962142919697">&አባለ ነገሮችን መርምር</translation> @@ -6097,7 +6098,6 @@ <translation id="697312151395002334">ብቅ-ባዮችን ለመላክ እና ማዞሪያዎችን ለመጠቀም ተፈቅዷል</translation> <translation id="6973611239564315524">ወደ Debian 10 (Buster) ደረጃ ማሻሻያ ይገኛል</translation> <translation id="69739764870135975">Google እንዲሁ የእርስዎ ነባሪ የፍለጋ ፕሮግራምዎ ከሆነ፣ የተሻለ፣ ከአውድ ጋር ተዛማጅነት ያላቸውን የአስተያየት ጥቆማዎች ያያሉ</translation> -<translation id="6974609594866392343">የመስመር ውጭ ማሳያ ሁነታ</translation> <translation id="697508444536771064">Linuxን ዝጋ</translation> <translation id="6978121630131642226">የፍለጋ ፕሮግራሞች</translation> <translation id="6979044105893951891">አስጀምር እና የሚተዳደሩ የእንግዳ ክፍለ ጊዜያትን ትተህ ውጣ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index b38ec582e26..76b161f 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -4772,7 +4772,6 @@ <translation id="5658415415603568799">لمزيد من الأمان، سيطلب منك Smart Lock إدخال كلمة مرورك بعد مرور 20 ساعة.</translation> <translation id="5659593005791499971">البريد الإلكتروني</translation> <translation id="5659833766619490117">تعذَّرت ترجمة هذه الصفحة</translation> -<translation id="566097169318652001">من المحتمَل أن يتوقف جهازك عن العمل بشكل صحيح، وقد تواجه مشاكل تتعلّق بالأمان والأداء. يُحتمَل أيضًا أن تتوقف الميزات الأساسية في تطبيقاتك عن العمل عندما تصبح قديمة، ولن يكون لك الحقّ في إجراء مطالبات قانونية.</translation> <translation id="5662513737565158057">تغيير طريقة عمل تطبيقات نظام التشغيل Linux</translation> <translation id="5667293444945855280">برامج ضارة</translation> <translation id="5667546120811588575">جارٍ إعداد Google Play...</translation> @@ -6097,7 +6096,6 @@ <translation id="697312151395002334">المواقع الإلكترونية التي يُسمح لها بإرسال النوافذ المنبثقة واستخدام عمليات إعادة التوجيه</translation> <translation id="6973611239564315524">تتوفّر ترقية إلى Debian 10 (Buster).</translation> <translation id="69739764870135975">إذا كان محرك البحث التلقائي هو Google، ستظهر لك اقتراحات أفضل وأكثر صلة بسياق عمليات البحث التي تجريها.</translation> -<translation id="6974609594866392343">وضع تجريبي بلا اتصال بالإنترنت</translation> <translation id="697508444536771064">إيقاف نظام التشغيل Linux</translation> <translation id="6978121630131642226">محرّكات البحث</translation> <translation id="6979044105893951891">بدء جلسات الضيوف المُدارة والخروج منها</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index dab48a6..ef212b4 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">ব্যৱহাৰকাৰী</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" />ৰ দৰে লাগিছে (পূৰ্বনিৰ্ধাৰিত)</translation> <translation id="1126809382673880764">আপোনাক বিপজ্জনক ৱেবছাইট, ডাউনল’ড অথবা এক্সটেনশ্বনসমূহৰ পৰা সুৰক্ষা প্ৰদান নকৰে। Gmail আৰু Searchৰ দৰে অন্য Google সেৱাসমূহ, য’ত সুৰক্ষিত ব্ৰাউজিঙৰ সুবিধাটো উপলব্ধ, সেইবিলাকত আপুনি তথাপি এই সুবিধাটো পাব।</translation> +<translation id="1128090040635299943">Linux বৰ্তমান কনফিগাৰ কৰি থকা হৈছে। কনফিগাৰৰ বাবে কেইমিনিটমান সময়ৰ প্ৰয়োজন হ’ব।</translation> <translation id="1128591060186966949">সন্ধান ইঞ্জিন সম্পাদনা কৰক</translation> <translation id="1129420403709586868">আপোনাৰ ফ’নটোৰ ফট’ আৰু মিডিয়া চাওক</translation> <translation id="1129850422003387628">এপ্সমূহ পৰিচালনা কৰক</translation> @@ -335,6 +336,7 @@ <translation id="1327794256477341646">এটা অৱস্থান আৱশ্যক হোৱা সুবিধাসমূহে কাম নকৰিব</translation> <translation id="1329191040029425999">আপোনাৰ ডিভাইচটো আপ টু ডে’ট হৈ থকাটো নিশ্চিত কৰক আৰু অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক</translation> <translation id="1330145147221172764">অন স্ক্ৰীণ কীব’র্ড সক্ষম কৰক</translation> +<translation id="1331625853030156663"><ph name="APP_NAME" /> খুলিবলৈ "নিষ্ক্ৰিয় হৈ থকাৰ পৰা সক্ৰিয় হওঁতে লক স্ক্ৰীন দেখুৱাওক"</translation> <translation id="1331977651797684645">এয়া ময়েই আছিলোঁ।</translation> <translation id="1333489022424033687">অন্য ছাইটসমূহে আপোনাৰ ডিভাইচত ষ্ট’ৰ কৰা ডেটা আপুনি নমচালৈকে <ph name="ORIGIN" />ত কিছুমান সুবিধাই কাম নকৰিবও পাৰে</translation> <translation id="1333965224356556482">ছাইটক আপোনাৰ অৱস্থান চোৱাৰ অনুমতি নিদিব</translation> @@ -3342,6 +3344,7 @@ <translation id="420283545744377356">স্ক্ৰীন ছেভাৰ অফ কৰক</translation> <translation id="4203065553461038553">ফাইলৰ নাম অথবা অৱস্থান অতি বেছি দীঘল</translation> <translation id="4204851595694839599">আপোনাৰ গে'ম খেলাৰ অভিজ্ঞতা কেনে?</translation> +<translation id="4205157409548006256">Linux কনফিগাৰ কৰি থাকোঁতে এটা আসোঁৱাহ হৈছে।</translation> <translation id="4206144641569145248">বহির্জগতৰ প্রাণী</translation> <translation id="4206323443866416204">মতামতৰ ৰিপ’র্ট</translation> <translation id="4207522141889799150"><ph name="SITE" />ৰ বাবে ছাইটৰ অনুমতি সম্পাদনা কৰক</translation> @@ -4783,7 +4786,6 @@ <translation id="5658415415603568799">অতিৰিক্ত সুৰক্ষাৰ বাবে Smart Lockএ আপোনাক ২০ ঘণ্টাৰ পিছত পাছৱৰ্ড দিবলৈ ক’ব।</translation> <translation id="5659593005791499971">ইমেইল</translation> <translation id="5659833766619490117">এই পৃষ্ঠাটো অনুবাদ কৰিব পৰা নগ’ল</translation> -<translation id="566097169318652001">আপোনাৰ ডিভাইচটোৱে আৰু সঠিককৈ কাম নকৰিব পাৰে আৰু আপুনি সুৰক্ষা আৰু কাৰ্যক্ষমতা সম্পৰ্কীয় সমস্যাৰ সন্মুখীন হ’ব পাৰে। আপোনাৰ এপ্সমূহ পুৰণি হ’লে সেইসমূহৰ মুখ্য সুবিধাসমূহেও কাম কৰা বন্ধ কৰিব পাৰে আৰু আপুনি আইনী দাবী কৰাৰ আপোনাৰ অধিকাৰ হেৰুৱাব।</translation> <translation id="5662513737565158057">Linux এপ্সমূহে কেনেদৰে কাম কৰিব সেয়া সলনি কৰক।</translation> <translation id="5667293444945855280">মালৱেৰ</translation> <translation id="5667546120811588575">Google Play ছেট আপ কৰি থকা হৈছে...</translation> @@ -5810,6 +5812,7 @@ <translation id="6686665106869989887">টেবটো সোঁফালে নিয়া হ'ল</translation> <translation id="6686817083349815241">আপোনাৰ পাছৱৰ্ড ছেভ কৰক</translation> <translation id="6687079240787935001"><ph name="MODULE_TITLE" /> লুকুৱাওক</translation> +<translation id="6688391094668641513"><ph name="ORIGIN" /> পঢ়িবলৈ আৰু সলনি কৰিবলৈ অনুৰোধ কৰি থকা হৈছে:</translation> <translation id="6689714331348768690"><ph name="SUPERVISED_USER_NAME" />ক কম্পিউটাৰ ব্যৱহাৰ কৰিবলৈ কওক। আপোনাৰ শিশুটিৰ কণ্ঠধ্বনিৰ মডেল সৃষ্টি কৰিবলৈ এই স্ক্ৰীনখনত তেওঁ কেইটামান বাক্যাংশ পঢ়িব। <ph name="BR" /> যদি <ph name="SUPERVISED_USER_NAME" />ক পঢ়াৰ ক্ষেত্ৰ সহায় লাগে, আপোনাৰ শিশুটিক আপুনি পঢ়ি যোৱাৰ লগে লগে কৈ যাবলৈ দিয়ক। মাইকটোৰ পৰা আঁতৰি সৰুকৈ কওক যাতে Assistantএ আপোনাৰ সলনি আপোনাৰ শিশুৰ কণ্ঠধ্বনি জানিব পাৰে।</translation> @@ -6104,7 +6107,6 @@ <translation id="697312151395002334">পপ-আপ পঠিওৱা আৰু ৰিডাইৰেক্ট ব্যৱহাৰ কৰাৰ অনুমতি আছে</translation> <translation id="6973611239564315524">Debian 10 (Buster)ৰ এটা আপগ্ৰে’ড উপলব্ধ</translation> <translation id="69739764870135975">লগতে যদি Google আপোনাৰ ডিফ’ল্ট সন্ধান ইঞ্জিন, তেন্তে আপুনি উন্নত, প্ৰাসংগিক পৰামৰ্শসমূহ দেখা পাব</translation> -<translation id="6974609594866392343">অফলাইন ডেম’ ম’ড</translation> <translation id="697508444536771064">Linux শ্বাট ডাউন কৰক</translation> <translation id="6978121630131642226">সন্ধান ইঞ্জিনসমূহ</translation> <translation id="6979044105893951891">লঞ্চ কৰক আৰু পৰিচালিত অতিথিৰ ছেশ্বনসমূহপৰা বাহিৰ হওক</translation> @@ -6323,6 +6325,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{পৃষ্ঠাৰ বাহিৰ হওক}one{পৃষ্ঠাসমূহৰ বাহিৰ হওক}other{পৃষ্ঠাসমূহৰ বাহিৰ হওক}}</translation> <translation id="7207457272187520234">ব্যৱহাৰ আৰু ডায়গনষ্টিক ডেটা পঠিয়াওক। এই ডিভাইচটোৱে বর্তমান স্বয়ংক্ৰিয়ভাৱে Googleলৈ ডায়গন’ষ্টিক, ডিভাইচ আৰু এপ্ ব্যৱহাৰৰ ডেটা পঠিয়াই আছে। এই কার্যটোৱে ছিষ্টেম আৰু এপৰ স্থিৰতা আৰু অন্য উন্নয়নত সহায় কৰিব। কিছুমান একত্ৰিত ডেটাই Google এপ্ আৰু Android বিকাশকৰ্তাৰ দৰে অংশীদাৰকো সহায় কৰিব। এই ছেটিংটো গৰাকীয়ে বলৱৎ কৰিছে। যদি আপোনাৰ অতিৰিক্ত ৱেব আৰু এপৰ কার্যকলাপৰ ছেটিংটো অন কৰা হয় তেন্তে এই ডেটাখিনি আপোনাৰ Google একাউণ্টত ছেভ কৰা হ’ব পাৰে।</translation> <translation id="7207631048330366454">এপসমূহ সন্ধান কৰক</translation> +<translation id="720808544705441386">এপ্টো খুলিব পৰা নাই</translation> <translation id="7210499381659830293">এক্সটেনশ্বন প্ৰিণ্টাৰ</translation> <translation id="7211783048245131419">এই পৰ্যন্ত কোনো ছুইচ আবণ্টন কৰা হোৱা নাই</translation> <translation id="7212097698621322584">আপোনাৰ বৰ্তমানৰ পিনটো সলনি কৰিবলৈ সেইটো দিয়ক। আপুনি যদি নিজৰ পিনটো নাজানে, আপুনি সুৰক্ষা চাবিটো ৰিছেট কৰি এটা নতুন পিন সৃষ্টি কৰিব লাগিব।</translation> @@ -7478,6 +7481,7 @@ <translation id="8324784016256120271">আপুনি বিভিন্ন ছাইটসমূহত কৰা ব্ৰাউজিঙৰ কার্যকলাপ চাবলৈ ছাইটসমূহে কুকিসমূহ ব্যৱহাৰ কৰিব পাৰে, যেনে, বিজ্ঞাপন ব্যক্তিগতকৃত কৰিবলৈ</translation> <translation id="8325413836429495820">আপোনাৰ ক্লিপব’ৰ্ড চোৱাৰ অনুমতি নাই</translation> <translation id="8326478304147373412">PKCS #7, প্ৰমাণপত্ৰ চ্চেইন</translation> +<translation id="8327386430364625757">গাণিতিক ফণ্ট</translation> <translation id="8327676037044516220">অনুমতি আৰু সমলৰ ছেটিংসমূহ</translation> <translation id="8330617762701840933">বিকল্প ব্ৰাউজাৰলৈ ৰিডাইৰেক্ট কৰা ৱেবছাইটসমূহৰ সূচীখন।</translation> <translation id="8330689128072902965">নিকটৱৰ্তী সম্পৰ্কসমূহে আপোনাৰ সৈতে শ্বেয়াৰ কৰিব পাৰে। সলনি কৰিবলৈ ক্লিক কৰক।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index b38a7408..8f305ae 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -129,6 +129,7 @@ <translation id="1124772482545689468">İstifadəçi</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Lokal)</translation> <translation id="1126809382673880764">Sizi təhlükəli veb sayt, endirmə və artırmalardan qorumur. Hələ də Gmail və Axtarış kimi digər Google xidmətlərində mümkün olduğu qədər Təhlükəsiz Baxış qoruması əldə edəcəksiniz.</translation> +<translation id="1128090040635299943">Linux hazırda konfiqurasiya edilir. Konfiqurasiya bir neçə dəqiqə çəkəcək.</translation> <translation id="1128591060186966949">Axtarış mühərrikinə düzəliş edin</translation> <translation id="1129420403709586868">Telefonunuzun fotolarına və mediasına baxın</translation> <translation id="1129850422003387628">Tətbiqləri idarə edin</translation> @@ -330,6 +331,7 @@ <translation id="1327794256477341646">Məkanınızı tələb edən xüsusiyyətlər işləməyəcək</translation> <translation id="1329191040029425999">Cihazınızın güncəl olduğuna əmin olun və yenidən cəhd edin</translation> <translation id="1330145147221172764">Ekranüstü klaviaturaları aktiv edin</translation> +<translation id="1331625853030156663"><ph name="APP_NAME" /> tətbiqini açmaq üçün "Yuxudan oyanarkən kilid ekranını göstər" seçimini aktiv edin</translation> <translation id="1331977651797684645">Mən idim.</translation> <translation id="1333489022424033687">Digər saytların cihazınızda saxladığı datanı silməsəniz,<ph name="ORIGIN" /> üzərindəki bəzi xüsusiyyətlər işləməyə bilər</translation> <translation id="1333965224356556482">Saytlara məkanınıza baxmaq icazəsi verməyin</translation> @@ -1951,6 +1953,7 @@ <translation id="2832124733806557606">Övladınız cihaza daxil olmaq və ya onu kiliddən çıxarmaq üçün PİN kod istifadə edə bilər.</translation> <translation id="2835177225987815960">Hər hansı təyin edilmiş açarlar və avtomatik skan sürəti seçimləri daxil olmaqla, cari skan ayarlamanız sıfırlanacaq.</translation> <translation id="2835547721736623118">Nitq tanınması xidməti</translation> +<translation id="2836232638504556905">Davam etmək üçün <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ad, e-poçt ünvanı və profil şəklinizi bu sayt ilə paylaşacaq. Bu saytın <ph name="BEGIN_LINK" />məxfilik siyasətinə<ph name="END_LINK" /> baxın.</translation> <translation id="2836269494620652131">Qəza</translation> <translation id="2836635946302913370">Bu istifadəçi adı ilə giriş aministratorunuz tərəfindən deaktiv edilib.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> şəbəkəsini istifadə etmək üçün ilk öncə internet bağlantınızı tamamlayın.</translation> @@ -2232,6 +2235,7 @@ <translation id="3105796011181310544">Google seçiminə qayıtmaq istəyirsiniz?</translation> <translation id="310671807099593501">Sayt bluetooth istifadə edir</translation> <translation id="3108931485517391283">Qəbul etmək olmur</translation> +<translation id="3109206895301430738">Yadda Saxlanmış Tab Qrupları</translation> <translation id="3109724472072898302">Yığcamlaşdı</translation> <translation id="311214366526552035">İstənilən halda endirin</translation> <translation id="3112292765614504292">Tətbiq ölçüsü: <ph name="APP_SIZE" /></translation> @@ -3327,6 +3331,7 @@ <translation id="420283545744377356">Ekran qoruyucusunu deaktiv edin</translation> <translation id="4203065553461038553">Fayl adı və ya məkan çox uzundur</translation> <translation id="4204851595694839599">Oyun sürəsi təcrübəniz necə keçdi?</translation> +<translation id="4205157409548006256">Linux'u konfiqurasiya edərkən xəta baş verdi.</translation> <translation id="4206144641569145248">Yadplanetli</translation> <translation id="4206323443866416204">Əks Əlaqə</translation> <translation id="4207522141889799150"><ph name="SITE" /> üçün sayt icazələrini redaktə edin</translation> @@ -4767,7 +4772,6 @@ <translation id="5658415415603568799">Əlavə təhlükəsizlik üçün Ağıllı Kilid 20 saatdan sonra parol tələb edəcək.</translation> <translation id="5659593005791499971">E-poçt</translation> <translation id="5659833766619490117">Bu səhifə tərcümə edilə bilməz</translation> -<translation id="566097169318652001">Cihazınız artıq düzgün işləməyə bilər və təhlükəsizlik və performans problemləri ilə üzləşə bilərsiniz. Tətbiqlərinizdəki əsas funksiyalar da köhnəldikdə işləməyi dayandıra bilər və siz qanuni iddialar irəli sürmək hüququnuzu itirəcəksiniz.</translation> <translation id="5662513737565158057">Linux tətbiqlərinin necə işləyəcəyini dəyişin.</translation> <translation id="5667293444945855280">Zərərli proqram</translation> <translation id="5667546120811588575">Google Play quraşdırılır...</translation> @@ -5790,6 +5794,7 @@ <translation id="6686665106869989887">Tab sağa köçürüldü</translation> <translation id="6686817083349815241">Parolunuzu yadda saxlayın</translation> <translation id="6687079240787935001"><ph name="MODULE_TITLE" /> modulunu gizlədin</translation> +<translation id="6688391094668641513"><ph name="ORIGIN" /> saytını oxumaq və dəyişmək tələb edilir:</translation> <translation id="6689714331348768690"><ph name="SUPERVISED_USER_NAME" /> adlı istifadəçidən kompüterə keçməsini xahiş edin. Övladınız öz səs modelini yaratmaq üçün bu ekranda bir neçə cümlə səsləndirəcək. <ph name="BR" /> <ph name="SUPERVISED_USER_NAME" /> adlı istifadəçinin oxumaqla bağlı köməyə ehtiyacı olsa, övladınızdan cümlələri sizdən sonra təkrar etməsini xahiş edin. Mikrofondan uzaqda pıçıltı ilə danışın ki, Assistent övladınızın əvəzinə sizin səsinizi öyrənməsin.</translation> @@ -6084,7 +6089,6 @@ <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> -<translation id="6974609594866392343">Oflayn demo rejimi</translation> <translation id="697508444536771064">Linux'u söndürün</translation> <translation id="6978121630131642226">Axtarış Sistemləri</translation> <translation id="6979044105893951891">İdarə edilən qonaq sessiyalarını başladın və sonlandırın</translation> @@ -6303,6 +6307,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Səhifədən Çıxın}other{Səhifələrdən Çıxın}}</translation> <translation id="7207457272187520234">İstifadə və diaqnostika datasını göndərin. Bu cihaz hazırda diaqnostika, cihaz və tətbiqdən istifadə datasını avtomatik Google'a göndərir. Bu, sistem və tətbiq sabitliyi və digər təkmilləşdirmələrə kömək edəcək. Bəzi ümumiləşdirilmiş məlumatlar Google tətbiqlərinə və Android tərtibatçıları kimi partnyorlara da kömək edəcək. Bu ayar sahibi tərəfindən tətbiq edilir. Əlavə Veb və Tətbiq Fəaliyyəti ayarı aktiv edilərsə, bu data Google Hesabınızda yadda saxlanıla bilər.</translation> <translation id="7207631048330366454">Tətbiqlərdə axtarın</translation> +<translation id="720808544705441386">Tətbiqi açmaq mümkün deyil</translation> <translation id="7210499381659830293">Artırma printerləri</translation> <translation id="7211783048245131419">Hələ heç bir düymə təyin edilməyib</translation> <translation id="7212097698621322584">Dəyişmək üçün cari PIN-i daxil edin. PIN-i bilmirsinizsə, güvənlik açarını sıfırlamalı, sonra isə yeni PIN yaratmalısınız.</translation> @@ -7458,6 +7463,7 @@ <translation id="8324784016256120271">Saytlar müxtəlif saytlarda baxış fəaliyyətinizi (məsələn, reklamları fərdiləşdirmək üçün) görmək üçün kukilərdən istifadə edə bilər</translation> <translation id="8325413836429495820">Mübadilə buferinizə baxmaq icazəsi verilməyib</translation> <translation id="8326478304147373412">PKCS # 7, sertifikat zənciri</translation> +<translation id="8327386430364625757">Riyazi şrift</translation> <translation id="8327676037044516220">İcazələr və məzmun ayarları</translation> <translation id="8330617762701840933">Alternativ brauzerə yönləndirilən vebsaytların siyahısı.</translation> <translation id="8330689128072902965">Yaxındakı kontaktlar sizinlə paylaşa bilər. Dəyişmək üçün klikləyin.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index eaefef6..bfc1bb8 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -876,6 +876,7 @@ <translation id="1823098433522728610">У гэтым дакуменце ёсць канфідэнцыяльнае змесціва.</translation> <translation id="18245044880483936">Даныя рэзервовай копіі не будуць улічвацца ў квоце сховішча вашага дзіцяці на Дыску.</translation> <translation id="1825565032302550710">Значэнне для порта павінна быць зададзена ў выглядзе ліку ад 1024 да 65535</translation> +<translation id="182577151972096764">нядаўна прагледжаныя рэцэпты</translation> <translation id="1826192255355608658">Сінхранізуйце закладкі, паролі, гісторыю і іншыя даныя ў браўзеры Chrome</translation> <translation id="1826516787628120939">Ідзе праверка</translation> <translation id="1827738518074806965">Мастацкая галерэя</translation> @@ -1309,6 +1310,7 @@ <translation id="2241053333139545397">Прагляд і змяненне вашых даных на шэрагу вэб-сайтаў</translation> <translation id="2241634353105152135">Толькі адзін раз</translation> <translation id="2242687258748107519">Інфармацыя аб файле</translation> +<translation id="2246129643805925002">Прылада "<ph name="DEVICE_TYPE" />" аўтаматычна ўсталёўвае абнаўленні ў фонавым рэжыме, каб у вас заўсёды быў доступ да новых функцый, а сама яна заставалася абароненай. Праглядзець параметры абнаўленняў можна ў Наладах.</translation> <translation id="2246549592927364792">Атрымліваць апісанні відарысаў ад Google?</translation> <translation id="2247738527273549923">Гэта прылада знаходзіцца пад кіраваннем вашай арганізацыі</translation> <translation id="2249111429176737533">Адкрыць як акно з укладкамі</translation> @@ -1598,6 +1600,7 @@ <translation id="249113932447298600">На жаль, прылада <ph name="DEVICE_LABEL" /> зараз не падтрымліваецца.</translation> <translation id="2492461744635776704">Рыхтуецца запыт на подпіс сертыфіката</translation> <translation id="2493126929778606526">Найлепшыя фота, выбраныя аўтаматычна</translation> +<translation id="2495524171012645395">Нядаўна прагледжаныя рэцэпты</translation> <translation id="2496180316473517155">Гісторыя прагляду сайтаў</translation> <translation id="2497229222757901769">Хуткасць мышы</translation> <translation id="2497852260688568942">Сінхранізацыя выключана вашым адміністратарам</translation> @@ -3416,6 +3419,7 @@ <translation id="4289732974614035569">Увядзіце PIN-код</translation> <translation id="4290791284969893584">Калі вы будзеце закрываць старонкі, задачы, пачатыя вамі, могуць заставацца незавершанымі</translation> <translation id="4291265871880246274">Дыялогавае акно для ўваходу</translation> +<translation id="429234155571566255">гэтыя нядаўна прагледжаныя рэцэпты</translation> <translation id="4295072614469448764">Праграма даступная ў тэрмінале. Акрамя таго, на панэль запуску мог быць дададзены яе значок.</translation> <translation id="4295979599050707005">Каб пацвердзіць, што ўліковы запіс <ph name="USER_EMAIL" /> можа выкарыстоўвацца з вэб-сайтамі, праграмамі і пашырэннямі ў браўзеры Chrome і краме Google Play, увайдзіце ў яго яшчэ раз. Таксама яго можна выдаліць. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Перазапусціць і скінуць</translation> @@ -3476,6 +3480,7 @@ <translation id="435527878592612277">Выберыце сваё фота</translation> <translation id="4358302248024731679">Каб лепш дыягнаставаць праблемы Bluetooth, супрацоўнікі Google могуць далучаць да справаздач з водгукамі дадатковыя журналы Bluetooth. Калі гэты параметр уключаны, справаздача будзе ўключаць у сябе журналы "btsnoop" і HCI з бягучага сеанса, максімальна ачышчаныя ад інфармацыі, па якой можна ідэнтыфікаваць асобу. Доступ да гэтых журналаў будуць мець толькі менеджары групы прадукту Chrome OS у Listnr. Праз 90 дзён журналы выдаляюцца.</translation> <translation id="4358313196493694334">Стабілізаваць пазіцыю курсора</translation> +<translation id="4358643842961018282">Прылада абноўлена</translation> <translation id="4359408040881008151">Усталявана, бо ёсць залежныя пашырэнні.</translation> <translation id="4359717112757026264">Гарадскі пейзаж</translation> <translation id="4361142739114356624">Закрыты ключ для гэтага кліенцкага сертыфіката адсутнічае або не дзейнічае</translation> @@ -4768,7 +4773,6 @@ <translation id="5658415415603568799">Для дадатковай бяспекі Smart Lock запытае ўвод пароля пасля 20 гадзін.</translation> <translation id="5659593005791499971">Адрас электроннай пошты</translation> <translation id="5659833766619490117">Не ўдалося перакласці старонку</translation> -<translation id="566097169318652001">Ваша прылада можа перастаць працаваць належным чынам. Магчымыя праблемы з прадукцыйнасцю і бяспекай. Калі не ўсталёўваць абнаўленні, могуць таксама перастаць працаваць асноўныя функцыі праграм, а вы страціце права заяўляць законныя прэтэнзіі.</translation> <translation id="5662513737565158057">Змяненне параметраў для праграм Linux.</translation> <translation id="5667293444945855280">Шкоднае ПЗ</translation> <translation id="5667546120811588575">Наладжваецца Google Play...</translation> @@ -6091,7 +6095,6 @@ <translation id="697312151395002334">Дазволена паказваць усплывальныя вокны або ажыццяўляць перанакіраванне</translation> <translation id="6973611239564315524">Даступна абнаўленне да Debian 10 (Buster)</translation> <translation id="69739764870135975">Калі Google з'яўляецца вашай стандартнай пошукавай сістэмай, вам будуць паказвацца больш адпаведныя кантэксту прапановы</translation> -<translation id="6974609594866392343">Пазасеткавы дэма-рэжым</translation> <translation id="697508444536771064">Завяршыць працу Linux</translation> <translation id="6978121630131642226">Пошукавыя сістэмы</translation> <translation id="6979044105893951891">Запуск і завяршэнне гасцявых сеансаў пад кіраваннем</translation> @@ -7110,6 +7113,7 @@ <translation id="7981313251711023384">Папярэдне загружаць старонкі для больш хуткага прагляду і пошуку</translation> <translation id="798145602633458219">Дадаць у поле пошуку прапанову "<ph name="SUGGESTION_NAME" />"</translation> <translation id="7981662863948574132">Паказаць усплывальнае акно з электронным ідэнтыфікатарам прылады і QR-кодам</translation> +<translation id="7981670705071137488">Пасля гэтага абнаўленні праграмнага забеспячэння будуць усталёўвацца ў фонавым рэжыме. Праглядзець параметры абнаўленняў можна ў Наладах.</translation> <translation id="7982083145464587921">Каб выправіць гэту памылку, перазапусціце прыладу.</translation> <translation id="7982789257301363584">Сетка</translation> <translation id="7984068253310542383">Адлюстраваць <ph name="DISPLAY_NAME" /></translation> @@ -7353,6 +7357,7 @@ <translation id="8214489666383623925">Адкрыць файл...</translation> <translation id="8215129063232901118">Атрымайце магчымасць выкарыстоўваць функцыі тэлефона з прылады <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Працягваць блакіраваць аўтаматычнае спампоўванне некалькіх файлаў</translation> +<translation id="822050276545350872">Больш не трэба чакаць</translation> <translation id="8221491193165283816">Звычайна вы блакіруеце апавяшчэнні. Каб даць дазвол гэтаму сайту на паказ апавяшчэнняў, націсніце тут.</translation> <translation id="822347941086490485">Ідзе пошук прылад HID...</translation> <translation id="8225046344534779393">Праверце падключэнне да інтэрнэту</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index f938b2b..7f72a0b 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -880,6 +880,7 @@ <translation id="1823098433522728610">В този документ има поверително съдържание.</translation> <translation id="18245044880483936">Данните в резервното копие не се отчитат в квотата на хранилището на детето ви в Диск.</translation> <translation id="1825565032302550710">Портът трябва да е число между 1024 и 65535</translation> +<translation id="182577151972096764">наскоро прегледаните рецепти</translation> <translation id="1826192255355608658">Синхронизиране на вашите отметки, пароли, история и др. в Chrome</translation> <translation id="1826516787628120939">Извършва се проверка</translation> <translation id="1827738518074806965">Художествена галерия</translation> @@ -1314,6 +1315,7 @@ <translation id="2241053333139545397">Четене и промяна на данните ви в няколко уебсайта.</translation> <translation id="2241634353105152135">Само веднъж</translation> <translation id="2242687258748107519">Информация за файла</translation> +<translation id="2246129643805925002">Устройството ви <ph name="DEVICE_TYPE" /> се актуализира автоматично на заден план, за да получавате най-новите функции и подобрения в сигурността. Можете да прегледате предпочитанията за актуализациите в настройките.</translation> <translation id="2246549592927364792">Да се изтеглят ли от Google описания за изображенията?</translation> <translation id="2247738527273549923">Устройството ви се управлява от организацията ви</translation> <translation id="2249111429176737533">Отваряне като прозорец с раздели</translation> @@ -1606,6 +1608,7 @@ <translation id="249113932447298600">За съжаление понастоящем устройството <ph name="DEVICE_LABEL" /> не се поддържа.</translation> <translation id="2492461744635776704">Заявката за подписване на сертификат се подготвя</translation> <translation id="2493126929778606526">Автоматично избиране на най-добрите ви снимки</translation> +<translation id="2495524171012645395">Наскоро прегледани рецепти</translation> <translation id="2496180316473517155">История на сърфирането</translation> <translation id="2497229222757901769">Скорост на мишката</translation> <translation id="2497852260688568942">Синхронизирането е деактивирано от администратора ви</translation> @@ -3426,6 +3429,7 @@ <translation id="4289732974614035569">Изберете ПИН</translation> <translation id="4290791284969893584">След като затворите дадена страница, стартираните от вас задачи може да не бъдат завършени</translation> <translation id="4291265871880246274">Диалогов прозорец за вход</translation> +<translation id="429234155571566255">тези наскоро прегледани рецепти</translation> <translation id="4295072614469448764">Приложението е налично в терминала. Възможно е също да има икона в стартовия панел.</translation> <translation id="4295979599050707005">Моля, влезте отново, за да потвърдите, че профилът ви <ph name="USER_EMAIL" /> може да се използва с уебсайтове, приложения и разширения в Chrome и Google Play. Имате възможност също да го премахнете. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Рестартиране и нулиране</translation> @@ -3486,6 +3490,7 @@ <translation id="435527878592612277">Изберете своя снимка</translation> <translation id="4358302248024731679">За по-добра диагностика на проблемите с Bluetooth служителите на Google могат да включват в сигналите си с отзиви допълнителни регистрационни файлове за Bluetooth. Когато за тази опция е поставена отметка, сигналът ви ще съдържа регистрационните файлове за btsnoop и HCI от текущата ви сесия, като от тях ще бъде премахната възможно най-много информация, позволяваща лично идентифициране (PII). Достъпът до тези файлове ще бъде ограничен до мениджърите на групата за продукта Chrome OS в Listnr. Файловете ще бъдат изтрити безвъзвратно след 90 дни.</translation> <translation id="4358313196493694334">Стабилизиране при мястото за кликване</translation> +<translation id="4358643842961018282">Устройството ви е актуално</translation> <translation id="4359408040881008151">Инсталирано заради зависимо разширение или съответно разширения.</translation> <translation id="4359717112757026264">Градски пейзажи</translation> <translation id="4361142739114356624">Частният ключ за този клиентски сертификат липсва или е невалиден</translation> @@ -4780,7 +4785,6 @@ <translation id="5658415415603568799">За допълнителна сигурност Smart Lock ще ви помоли да въведете паролата си след 20 часа.</translation> <translation id="5659593005791499971">Имейл</translation> <translation id="5659833766619490117">Тази страница не можа да бъде преведена</translation> -<translation id="566097169318652001">Възможно е устройството ви вече да не работи правилно и може да имате проблеми със сигурността и производителността. Ключовите функции в някои приложения също може да спрат да работят, когато не са актуални, и ще изгубите правото си да предявявате правни искове.</translation> <translation id="5662513737565158057">Променете начина на работа на приложенията за Linux.</translation> <translation id="5667293444945855280">Злонамерен софтуер</translation> <translation id="5667546120811588575">Google Play се настройва...</translation> @@ -6097,7 +6101,6 @@ <translation id="697312151395002334">Сайтове с разрешение за изпращане на изскачащи прозорци и използване на пренасочвания</translation> <translation id="6973611239564315524">Налице е надстройка до Debian 10 (Buster)</translation> <translation id="69739764870135975">Ако Google е и търсещата ви машина по подразбиране, ще виждате по-добри и контекстуално уместни предложения</translation> -<translation id="6974609594866392343">Офлайн демонстрационен режим</translation> <translation id="697508444536771064">Изключване на Linux</translation> <translation id="6978121630131642226">Търсещи машини</translation> <translation id="6979044105893951891">Стартиране и прекратяване на управлявани сесии като гост</translation> @@ -7117,6 +7120,7 @@ <translation id="7981313251711023384">Предварително зареждане на страниците с цел по-бързо сърфиране и търсене</translation> <translation id="798145602633458219">Добавяне на предложението <ph name="SUGGESTION_NAME" /> към полето за търсене</translation> <translation id="7981662863948574132">Показване на изскачащ прозорец с EID номера на устройството и QR код</translation> +<translation id="7981670705071137488">След това софтуерните актуализации ще се извършват на заден план. Можете да прегледате предпочитанията за тях в настройките.</translation> <translation id="7982083145464587921">Моля, рестартирайте устройството си, за да поправите тази грешка.</translation> <translation id="7982789257301363584">Мрежа</translation> <translation id="7984068253310542383">Дублиране на <ph name="DISPLAY_NAME" /></translation> @@ -7361,6 +7365,7 @@ <translation id="8214489666383623925">Отваряне на файл...</translation> <translation id="8215129063232901118">Осъществявайте достъп до функциите на телефона си от устройството си <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Автоматичното изтегляне на няколко файла да остане блокирано</translation> +<translation id="822050276545350872">Оттук нататък не се изисква чакане</translation> <translation id="8221491193165283816">Обикновено блокирате известията. Кликнете тук, за да разрешите на този сайт да ви изпраща известия.</translation> <translation id="822347941086490485">Търсят се HID устройства...</translation> <translation id="8225046344534779393">Проверете връзката с интернет</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index bd73e52..143f397 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -4789,7 +4789,6 @@ <translation id="5658415415603568799">অতিরিক্ত নিরাপত্তার জন্য, ২০ ঘণ্টা পরে Smart Lock আপনাকে পাসওয়ার্ড দিতে বলবে।</translation> <translation id="5659593005791499971">ইমেল আইডি</translation> <translation id="5659833766619490117">এই পৃষ্ঠাটির অনুবাদ করা যায়নি</translation> -<translation id="566097169318652001">আপনার ডিভাইস আর সঠিকভাবে কাজ নাও করতে পারে এবং আপনি নিরাপত্তা এবং পারফর্ম্যান্স সংক্রান্ত সমস্যার সম্মুখীন হতে পারেন। আপনার অ্যাপের মূল ফিচারগুলি পুরানো হয়ে গেলে কাজ করা বন্ধ করে দিতে পারে এবং আপনি আইনি দাবি করার অধিকার হারাবেন।</translation> <translation id="5662513737565158057">কীভাবে Linux অ্যাপ কাজ করবে তা পরিবর্তন করুন।</translation> <translation id="5667293444945855280">দূষিত</translation> <translation id="5667546120811588575">Google Play সেট-আপ করা হচ্ছে...</translation> @@ -6111,7 +6110,6 @@ <translation id="697312151395002334">পপ-আপ পাঠানো ও রিডাইরেক্ট করার অনুমতি দেওয়া হয়েছে</translation> <translation id="6973611239564315524">Debian 10 (Buster) ভার্সনে আপগ্রেড করার সুবিধা পাওয়া যাচ্ছে</translation> <translation id="69739764870135975">তাছাড়া, Google আপনার ডিফল্ট সার্চ ইঞ্জিন হিসেবে সেট করা থাকলে, আপনি আরও ভাল ও প্রাসঙ্গিক সাজেশন দেখতে পাবেন</translation> -<translation id="6974609594866392343">অফলাইন ডেমো মোড</translation> <translation id="697508444536771064">Linux বন্ধ করুন</translation> <translation id="6978121630131642226">সার্চ ইঞ্জিনসমূহ</translation> <translation id="6979044105893951891">ম্যানেজ করা গেস্ট সেশন লঞ্চ করে সেটি থেকে বেরিয়ে আসুন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 1bfded9..2ad7b4e 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">Korisnik</translation> <translation id="1125550662859510761">Izgleda kao <ph name="WIDTH" /> x <ph name="HEIGHT" /> (Izvorno)</translation> <translation id="1126809382673880764">Ne štiti vas od opasnih web lokacija, preuzimanja i ekstenzija. I dalje ćete dobijati zaštitu Sigurno pregledanje, tamo gdje je dostupna, na drugim Googleovim uslugama kao što su Gmail i Pretraživanje.</translation> +<translation id="1128090040635299943">Linux se trenutačno konfigurira. Konfiguracija će potrajati nekoliko minuta.</translation> <translation id="1128591060186966949">Uređivanje pretraživača</translation> <translation id="1129420403709586868">Pregledajte fotografije i medijski sadržaj telefona</translation> <translation id="1129850422003387628">Upravljajte aplikacijama</translation> @@ -336,6 +337,7 @@ <translation id="1327794256477341646">Funkcije za koje je potrebna vaša lokacija neće funkcionirati</translation> <translation id="1329191040029425999">Provjerite je li uređaj ažuriran i pokušajte ponovo</translation> <translation id="1330145147221172764">Omogući tastaturu na ekranu</translation> +<translation id="1331625853030156663">Da biste otvorili aplikaciju <ph name="APP_NAME" />, omogućite opciju "Prikaži zaključan zaslon prilikom vraćanja iz mirovanja"</translation> <translation id="1331977651797684645">To sam ja.</translation> <translation id="1333489022424033687">Neke funkcije web lokacije <ph name="ORIGIN" /> možda neće raditi dok ne obrišete podatke koje su druge web lokacije pohranile na vašem uređaju</translation> <translation id="1333965224356556482">Nemoj dozvoliti web lokacijama prikaz lokacije</translation> @@ -1318,7 +1320,7 @@ <translation id="2241053333139545397">Čitati i mijenjati vaše podatke na nizu web lokacija</translation> <translation id="2241634353105152135">Samo ovaj put</translation> <translation id="2242687258748107519">Podaci o fajlu</translation> -<translation id="2246129643805925002">Uređaj <ph name="DEVICE_TYPE" /> automatski se ažurira u pozadini i pruža najnovije značajke i poboljšanja sigurnosti. Postavke ažuriranja možete pregledati u postavkama.</translation> +<translation id="2246129643805925002">Vaš uređaj <ph name="DEVICE_TYPE" /> se automatski ažurira u pozadini da vam donese najnovije funkcije i sigurnosna poboljšanja. Postavke ažuriranja možete pregledati u Postavkama.</translation> <translation id="2246549592927364792">Preuzeti opis slike s Googlea?</translation> <translation id="2247738527273549923">Ovim uređajem upravlja vaša organizacija</translation> <translation id="2249111429176737533">Otvori kao prozor s karticama</translation> @@ -3344,6 +3346,7 @@ <translation id="420283545744377356">Isključite čuvara ekrana</translation> <translation id="4203065553461038553">Naziv fajla ili lokacije je predug</translation> <translation id="4204851595694839599">Kakvo vam je bilo iskustvo s igranjem igre?</translation> +<translation id="4205157409548006256">Došlo je do pogreške prilikom konfiguriranja Linuxa.</translation> <translation id="4206144641569145248">Vanzemaljac</translation> <translation id="4206323443866416204">Izvještaj o povratnim informacijama</translation> <translation id="4207522141889799150">Uredite odobrenja web lokacije za <ph name="SITE" /></translation> @@ -3491,7 +3494,7 @@ <translation id="435527878592612277">Odaberite fotografiju</translation> <translation id="4358302248024731679">Za bolju dijagnozu problema s Bluetoothom, korisnici Googlea u svoje izvještaje s povratnim informacijama mogu uvrstiti dodatne zapisnike o Bluetoothu. Kada je ova opcija označena, vaš izvještaj će obuhvatati btsnoop i HCI zapisnike iz vaše trenutne sesije, pročišćene radi uklanjanja ličnih podataka pomoću kojih se korisnik može identificirati. Pristup tim zapisnicima će biti ograničen na upravitelje grupe proizvoda za ChromeOS u Listnru. Zapisnici će se očistiti nakon 90 dana.</translation> <translation id="4358313196493694334">Stabiliziraj lokaciju klika</translation> -<translation id="4358643842961018282">Uređaj je ažuriran</translation> +<translation id="4358643842961018282">Vaš uređaj je ažuriran</translation> <translation id="4359408040881008151">Instalirano zbog zavisnih ekstenzija.</translation> <translation id="4359717112757026264">Gradski pejzaži</translation> <translation id="4361142739114356624">Pprivatni ključ za potvrdu ovog klijenta nedostaje ili je nevažeći</translation> @@ -4785,7 +4788,6 @@ <translation id="5658415415603568799">Radi dodatne sigurnosti Smart Lock će od vas tražiti da unesete lozinku nakon 20 sati.</translation> <translation id="5659593005791499971">E-pošta</translation> <translation id="5659833766619490117">Ova stranica nije prevedena</translation> -<translation id="566097169318652001">Vaš uređaj možda više neće funkcionirati ispravno i možete naići na probleme sa sigurnošću i performansama. Ključne funkcije u vašim aplikacijama također mogu prestati funkcionirati kada postanu zastarjele, a izgubit ćete pravo na polaganje pravnih zahtjeva.</translation> <translation id="5662513737565158057">Promjena načina na koji će Linux aplikacije funkcionirati.</translation> <translation id="5667293444945855280">Zlonamjerni softver</translation> <translation id="5667546120811588575">Postavljanje Google Playa...</translation> @@ -5639,7 +5641,7 @@ <translation id="6520876759015997832">Rezultat pretraživanja: <ph name="LIST_POSITION" /> od <ph name="LIST_SIZE" /> za <ph name="SEARCH_RESULT_TEXT" />. Pritisnite Enter da posjetite odjeljak.</translation> <translation id="6521214596282732365">Web lokacije obično koriste fontove da pomoću alata za online dizajn i grafičko crtanje možete kreirati sadržaj visoke vrijednosti</translation> <translation id="6523303810310758032">Kada izbrišete historiju pregledanja, cijelu ili samo za određene web lokacije, također brišete povezane informacije o mjerenju. Pogledajte <ph name="BEGIN_LINK" />svoju historiju pregledanja<ph name="END_LINK" /></translation> -<translation id="6523574494641144162">Google upravitelj zaporki nije mogao spremiti ove zaporke na vaš Google račun. Možete ih spremiti na ovaj uređaj.</translation> +<translation id="6523574494641144162">Google upravitelj lozinki nije uspio sačuvati ove lozinke na vaš Google račun. Možete ih sačuvati na ovaj uređaj.</translation> <translation id="6524735478670290456">Kako koristimo ove podatke:</translation> <translation id="652492607360843641">Povezani ste na <ph name="NETWORK_TYPE" /> mrežu.</translation> <translation id="6527303717912515753">Dijeli</translation> @@ -5814,6 +5816,7 @@ <translation id="6686665106869989887">Kartica je pomjerena udesno</translation> <translation id="6686817083349815241">Sačuvajte svoju lozinku</translation> <translation id="6687079240787935001">Sakrij: <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">Zahtijevanje čitanja i promjene web-lokacije <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">Zamolite dijete (<ph name="SUPERVISED_USER_NAME" />) da dođe do računara. Dijete će pročitati nekoliko fraza s ovog ekrana da kreira svoj model glasa. <ph name="BR" /> Ako <ph name="SUPERVISED_USER_NAME" /> treba pomoć s čitanjem, neka ponavlja tekst za vama. Šapćite tekst dalje od mikrofona tako da Asistent uči glas vašeg djeteta, a ne vaš.</translation> @@ -5948,7 +5951,7 @@ <translation id="6818198425579322765">Jezik stranice za prijevod</translation> <translation id="6818547713623251698">Pregledajte fotografije, medijski sadržaj, obavještenja i aplikacije telefona</translation> <translation id="6818802132960437751">Ugrađena zaštita od virusa</translation> -<translation id="6818920801736417483">Spremiti zaporke?</translation> +<translation id="6818920801736417483">Sačuvati lozinke?</translation> <translation id="6823174134746916417">Dodir za klik dodirne podloge</translation> <translation id="6824564591481349393">Kopiraj adresu &e-pošte</translation> <translation id="6824584962142919697">&Provjeri elemente</translation> @@ -6108,7 +6111,6 @@ <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> -<translation id="6974609594866392343">Način rada za demonstraciju van mreže</translation> <translation id="697508444536771064">Isključi Linux</translation> <translation id="6978121630131642226">Pretraživači</translation> <translation id="6979044105893951891">Pokretanje i izlaz iz upravljanih sesija gosta</translation> @@ -6327,6 +6329,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Napusti stranicu}one{Napusti stranice}few{Napusti stranice}other{Napusti stranice}}</translation> <translation id="7207457272187520234">Šaljite podatke o korištenju i dijagnostici. Ovaj uređaj trenutno automatski šalje Googleu podatke o dijagnostici, uređaju i korištenju aplikacija. To će pomoći stabilnosti sistema i aplikacija, kao i drugim poboljšanjima. Neki zbirni podaci će također pomoći Googleovim aplikacijama i partnerima, kao što su Androidovi programeri. Ovu postavku je nametnuo vlasnik. Ako vam je uključena postavka dodatna Aktivnost na webu i u aplikacijama, ti podaci će možda biti sačuvani na vašem Google računu.</translation> <translation id="7207631048330366454">Pretražite aplikacije</translation> +<translation id="720808544705441386">Aplikacija se ne može otvoriti</translation> <translation id="7210499381659830293">Štampači ekstenzija</translation> <translation id="7211783048245131419">Još uvijek nije dodijeljen nijedan prekidač za pristup</translation> <translation id="7212097698621322584">Unesite sadašnji PIN da ga promijenite. Ako ne znate svoj PIN, moraćete poništiti sigurnosni ključ, a zatim kreirati novi PIN.</translation> @@ -7128,7 +7131,7 @@ <translation id="7981313251711023384">Prethodno učitaj stranice za brže pregledavanje i pretraživanje</translation> <translation id="798145602633458219">Dodaj prijedlog <ph name="SUGGESTION_NAME" /> u okvir za pretraživanje</translation> <translation id="7981662863948574132">Prikazivanje skočnog prozora s EID brojem i QR kodom uređaja</translation> -<translation id="7981670705071137488">Ažuriranja softvera će se nakon toga odvijati u pozadini. Postavke ažuriranja možete pregledati u postavkama.</translation> +<translation id="7981670705071137488">Nakon ovoga, ažuriranja softvera će se odvijati u pozadini. Postavke ažuriranja možete pregledati u Postavkama.</translation> <translation id="7982083145464587921">Ponovo pokrenite uređaj za ispravak ove pogreške.</translation> <translation id="7982789257301363584">Mreža</translation> <translation id="7984068253310542383">Preslikavanje <ph name="DISPLAY_NAME" /></translation> @@ -7373,7 +7376,7 @@ <translation id="8214489666383623925">Otvori fajl...</translation> <translation id="8215129063232901118">Pristupite mogućnostima telefona s uređaja <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Nastavi blokiranje automatskih preuzimanja više fajlova</translation> -<translation id="822050276545350872">Odsad nadalje nema čekanja</translation> +<translation id="822050276545350872">Od sada pa nadalje, nije potrebno čekati</translation> <translation id="8221491193165283816">Obično blokirate obavještenja. Da dozvolite ovoj web lokaciji da vas obavještava, kliknite ovdje.</translation> <translation id="822347941086490485">Pronalaženje HID uređaja...</translation> <translation id="8225046344534779393">Provjerite internetsku vezu</translation> @@ -7484,6 +7487,7 @@ <translation id="8324784016256120271">Web lokacije mogu koristiti kolačiće da vide vašu aktivnost pregledanja na različitim web lokacijama, naprimjer, radi personaliziranja oglasa</translation> <translation id="8325413836429495820">Nije dozvoljen pregled vaše međumemorije</translation> <translation id="8326478304147373412">PKCS br. 7, lanac potvrda</translation> +<translation id="8327386430364625757">Matematički font</translation> <translation id="8327676037044516220">Odobrenja i postavke sadržaja</translation> <translation id="8330617762701840933">Lista web lokacija koje se preusmjeravaju na alternativni preglednik.</translation> <translation id="8330689128072902965">Kontakti u blizini mogu dijeliti s vama. Kliknite da promijenite.</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 97c5329e..98432e8a 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -873,6 +873,7 @@ <translation id="1823098433522728610">Aquest document inclou contingut sensible.</translation> <translation id="18245044880483936">Les dades de la còpia de seguretat no ocupen espai de la quota d'emmagatzematge de Drive del teu fill.</translation> <translation id="1825565032302550710">El port ha d'estar entre 1024 i 65535</translation> +<translation id="182577151972096764">receptes vistes recentment</translation> <translation id="1826192255355608658">Sincronitza les adreces d'interès, les contrasenyes, l'historial i altres elements del teu navegador Chrome</translation> <translation id="1826516787628120939">S'està comprovant</translation> <translation id="1827738518074806965">Galeria d'art</translation> @@ -1306,6 +1307,7 @@ <translation id="2241053333139545397">Llegir i modificar les dades d'una sèrie de llocs web</translation> <translation id="2241634353105152135">Només una vegada</translation> <translation id="2242687258748107519">Informació del fitxer</translation> +<translation id="2246129643805925002">El teu <ph name="DEVICE_TYPE" /> s'actualitza automàticament en segon pla per oferir-te les darreres funcions i millores de seguretat. Pots revisar les preferències d'actualització a Configuració.</translation> <translation id="2246549592927364792">Vols obtenir descripcions d'imatges de Google?</translation> <translation id="2247738527273549923">La teva organització gestiona aquest dispositiu</translation> <translation id="2249111429176737533">Obre com a finestra amb pestanyes</translation> @@ -1595,6 +1597,7 @@ <translation id="249113932447298600">El dispositiu <ph name="DEVICE_LABEL" /> no és compatible en aquests moments.</translation> <translation id="2492461744635776704">S'està preparant la sol·licitud de signatura del certificat</translation> <translation id="2493126929778606526">Les teves millors fotos, seleccionades automàticament</translation> +<translation id="2495524171012645395">Receptes vistes recentment</translation> <translation id="2496180316473517155">Historial de navegació</translation> <translation id="2497229222757901769">Velocitat del ratolí</translation> <translation id="2497852260688568942">L'administrador ha desactivat la sincronització</translation> @@ -3413,6 +3416,7 @@ <translation id="4289732974614035569">Tria un PIN</translation> <translation id="4290791284969893584">En tancar una pàgina, pot ser que les tasques que hagis començat no finalitzin</translation> <translation id="4291265871880246274">Quadre de diàleg d'inici de sessió</translation> +<translation id="429234155571566255">aquestes receptes vistes recentment</translation> <translation id="4295072614469448764">L'aplicació està disponible al terminal. També pot haver-hi una icona al menú d'aplicacions.</translation> <translation id="4295979599050707005">Torna a iniciar la sessió per confirmar que el compte <ph name="USER_EMAIL" /> es pot utilitzar amb llocs web, aplicacions i extensions de Chrome i Google Play. També pots suprimir el compte. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Reinicia i restableix</translation> @@ -3473,6 +3477,7 @@ <translation id="435527878592612277">Selecciona la teva foto</translation> <translation id="4358302248024731679">Per diagnosticar millor els problemes del Bluetooth, els Googlers poden incloure registres de Bluetooth addicionals als seus informes de suggeriments. Si aquesta opció està marcada, l'informe inclourà registres BTSnoop i HCI de la teva sessió actual, que es depurarà per suprimir tanta informació d'identificació personal (IIP) com sigui possible. L'accés a aquests registres es restringirà als gestors del grup de productes de Chrome OS a Listnr. Els registres se suprimiran permanentment al cap de 90 dies.</translation> <translation id="4358313196493694334">Estabilitza la ubicació del clic</translation> +<translation id="4358643842961018282">El dispositiu està actualitzat</translation> <translation id="4359408040881008151">S'ha instal·lat perquè té extensions que en depenen.</translation> <translation id="4359717112757026264">Paisatge urbà</translation> <translation id="4361142739114356624">Falta la clau privada d'aquest certificat del client o no és vàlida</translation> @@ -4765,7 +4770,6 @@ <translation id="5658415415603568799">Per a més seguretat, Smart Lock et demanarà que introdueixis la contrasenya al cap de 20 hores.</translation> <translation id="5659593005791499971">Adreça electrònica</translation> <translation id="5659833766619490117">Aquesta pàgina no s'ha pogut traduir</translation> -<translation id="566097169318652001">És possible que el dispositiu ja no funcioni correctament i que tinguis problemes de seguretat i de rendiment. També pot ser que funcions clau de les teves aplicacions deixin de funcionar quan quedin obsoletes i que perdis el dret de fer reclamacions legals.</translation> <translation id="5662513737565158057">Canvia com funcionaran les aplicacions de Linux.</translation> <translation id="5667293444945855280">Programari maliciós</translation> <translation id="5667546120811588575">S'està configurant Google Play...</translation> @@ -6081,7 +6085,6 @@ <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> -<translation id="6974609594866392343">Mode de demostració sense connexió</translation> <translation id="697508444536771064">Apaga Linux</translation> <translation id="6978121630131642226">Motors de cerca</translation> <translation id="6979044105893951891">Llança sessions de convidat administrades i surt-ne</translation> @@ -7101,6 +7104,7 @@ <translation id="7981313251711023384">Precarrega les pàgines per navegar i fer cerques més de pressa</translation> <translation id="798145602633458219">Afegeix el suggeriment <ph name="SUGGESTION_NAME" /> al quadre de cerca</translation> <translation id="7981662863948574132">Mostra la finestra emergent amb el codi QR i amb l'EID del dispositiu</translation> +<translation id="7981670705071137488">Un cop acabi aquest procés, les actualitzacions del programari es duran a terme en segon pla. Pots revisar les preferències d'actualització a Configuració.</translation> <translation id="7982083145464587921">Reinicieu el dispositiu per corregir aquest error.</translation> <translation id="7982789257301363584">Xarxa</translation> <translation id="7984068253310542383">Projecta <ph name="DISPLAY_NAME" /></translation> @@ -7345,6 +7349,7 @@ <translation id="8214489666383623925">Obre un fitxer...</translation> <translation id="8215129063232901118">Accedeix a les capacitats del teu telèfon des del teu <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Continua bloquejant les baixades automàtiques de diversos fitxers</translation> +<translation id="822050276545350872">Ja no hauràs d'esperar més vegades</translation> <translation id="8221491193165283816">Normalment bloqueges les notificacions. Per permetre que aquest lloc web et mostri notificacions, fes clic aquí.</translation> <translation id="822347941086490485">S'estan cercant dispositius d'interfície humana...</translation> <translation id="8225046344534779393">Comprova la connexió a Internet</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 4abdcd3..9604713 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -875,6 +875,7 @@ <translation id="1823098433522728610">Tento dokument má citlivý obsah.</translation> <translation id="18245044880483936">Zálohovaná data se nezapočítávají do kvóty úložiště na Disku dítěte.</translation> <translation id="1825565032302550710">Číslo portu musí být mezi 1024 a 65535</translation> +<translation id="182577151972096764">nedávno zobrazené recepty</translation> <translation id="1826192255355608658">Synchronizujte záložky, hesla, historii a další položky v prohlížeči Chrome</translation> <translation id="1826516787628120939">Probíhá kontrola</translation> <translation id="1827738518074806965">Galerie umění</translation> @@ -1308,6 +1309,7 @@ <translation id="2241053333139545397">Čtení a úprava dat na různých webech</translation> <translation id="2241634353105152135">Pouze jednou</translation> <translation id="2242687258748107519">Informace o souboru</translation> +<translation id="2246129643805925002">Zařízení <ph name="DEVICE_TYPE" /> se bude automaticky aktualizovat na pozadí, abyste měli k dispozici nejnovější funkce a vylepšení zabezpečení. Předvolby aktualizací můžete zkontrolovat v Nastavení.</translation> <translation id="2246549592927364792">Získávat popisy obrázků z Googlu?</translation> <translation id="2247738527273549923">Zařízení spravuje vaše organizace</translation> <translation id="2249111429176737533">Otevřít jako okno na kartě</translation> @@ -1597,6 +1599,7 @@ <translation id="249113932447298600">Je nám líto, zařízení <ph name="DEVICE_LABEL" /> není v současné době podporováno.</translation> <translation id="2492461744635776704">Probíhá příprava žádosti o podepsání certifikátu</translation> <translation id="2493126929778606526">Vaše nejlepší fotky, vybrané automaticky</translation> +<translation id="2495524171012645395">Nedávno zobrazené recepty</translation> <translation id="2496180316473517155">Historie procházení</translation> <translation id="2497229222757901769">Rychlost myši</translation> <translation id="2497852260688568942">Synchronizace je administrátorem zakázána.</translation> @@ -3414,6 +3417,7 @@ <translation id="4289732974614035569">Zvolte PIN</translation> <translation id="4290791284969893584">Po zavření stránky se zahájené úlohy nemusí dokončit</translation> <translation id="4291265871880246274">Přihlašovací dialogové okno</translation> +<translation id="429234155571566255">tyto nedávno zobrazené recepty</translation> <translation id="4295072614469448764">Aplikace je k dispozici v terminálu. Také může mít ikonu ve Spouštěči.</translation> <translation id="4295979599050707005">Přihlaste se znovu a potvrďte, že je váš účet <ph name="USER_EMAIL" /> možné používat pro weby, aplikace a rozšíření v Chromu a na Google Play. Tento účet můžete také odstranit. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Restartovat a resetovat</translation> @@ -3474,6 +3478,7 @@ <translation id="435527878592612277">Vyberte svou fotografii</translation> <translation id="4358302248024731679">Pro lepší diagnostiku problémů s rozhraním Bluetooth mohou zaměstnanci společnosti Google ke zpětné vazbě přiložit protokoly rozhraní Bluetooth. Když je tato možnost zaškrtnutá, bude hlášení zahrnovat protokoly btsnoop a HCI z aktuální relace, z nichž bylo odstraněno co nejvíc údajů umožňujících zjištění totožnosti. K těmto protokolům budou mít přístup pouze správci skupiny produktů ChromeOS v nástroji Listnr. Po 90 dnech budou protokoly trvale odstraněny.</translation> <translation id="4358313196493694334">Stabilizovat místo kliknutí</translation> +<translation id="4358643842961018282">Zařízení je aktualizováno</translation> <translation id="4359408040881008151">Rozšíření bylo nainstalováno kvůli závislým rozšířením.</translation> <translation id="4359717112757026264">Města</translation> <translation id="4361142739114356624">Soukromý klíč tohoto klientského certifikátu chybí nebo je neplatný</translation> @@ -4764,7 +4769,6 @@ <translation id="5658415415603568799">Z důvodu lepšího zabezpečení vás Smart Lock po 20 hodinách požádá o opětovné zadání hesla.</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5659833766619490117">Tuto stránku se nepodařilo přeložit</translation> -<translation id="566097169318652001">Vaše zařízení již nemusí pracovat správně a mohou se vyskytnout problémy se zabezpečením a výkonem. Když se aplikace stanou zastaralými, mohou také přestat fungovat jejich klíčové funkce a ztratíte právo na uplatnění právních nároků.</translation> <translation id="5662513737565158057">Změna fungování linuxových aplikací.</translation> <translation id="5667293444945855280">Malware</translation> <translation id="5667546120811588575">Nastavování Google Play...</translation> @@ -5617,6 +5621,7 @@ <translation id="6520876759015997832">Výsledek vyhledávání <ph name="LIST_POSITION" /> z <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Stisknutím klávesy Enter přejdete do sekce.</translation> <translation id="6521214596282732365">Weby obvykle používají vaše písma, takže můžete vytvářet vysoce kvalitní obsah pomocí online designérských a grafických nástrojů</translation> <translation id="6523303810310758032">Když smažete historii prohlížení (celou nebo na určitém webu), smažou se i související informace o měření. Viz <ph name="BEGIN_LINK" />historie prohlížení<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Správce hesel Google tato hesla nemohl uložit do vašeho účtu Google. Můžete je uložit do tohoto zařízení.</translation> <translation id="6524735478670290456">Jak tyto údaje používáme:</translation> <translation id="652492607360843641">Jste připojení k tomuto typu sítě: <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Sdílet</translation> @@ -5925,6 +5930,7 @@ <translation id="6818198425579322765">Jazyk stránky k překladu</translation> <translation id="6818547713623251698">Zobrazovat fotky, média, oznámení a aplikace z telefonu</translation> <translation id="6818802132960437751">Integrovaná antivirová ochrana</translation> +<translation id="6818920801736417483">Ukládat hesla?</translation> <translation id="6823174134746916417">Kliknutí klepnutím na touchpadu</translation> <translation id="6824564591481349393">Kopírovat &e-mailovou adresu</translation> <translation id="6824584962142919697">&Prozkoumat prvky</translation> @@ -6084,7 +6090,6 @@ <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> -<translation id="6974609594866392343">Ukázkový režim offline</translation> <translation id="697508444536771064">Ukončit Linux</translation> <translation id="6978121630131642226">Vyhledávače</translation> <translation id="6979044105893951891">Spouštět a ukončovat spravované relace hostů</translation> @@ -7103,6 +7108,7 @@ <translation id="7981313251711023384">Předběžně načítat stránky pro rychlejší procházení a vyhledávání</translation> <translation id="798145602633458219">Přidat návrh <ph name="SUGGESTION_NAME" /> do vyhledávacího pole</translation> <translation id="7981662863948574132">Zobrazit vyskakovací okno s EID zařízení a QR kódem</translation> +<translation id="7981670705071137488">Aktualizace softwaru budou probíhat na pozadí. Předvolby aktualizací můžete zkontrolovat v Nastavení.</translation> <translation id="7982083145464587921">Chcete-li chybu opravit, restartujte prosím zařízení.</translation> <translation id="7982789257301363584">Síť</translation> <translation id="7984068253310542383">Zrcadlit obrazovku <ph name="DISPLAY_NAME" /></translation> @@ -7347,6 +7353,7 @@ <translation id="8214489666383623925">Otevřít soubor...</translation> <translation id="8215129063232901118">Používejte v zařízení <ph name="DEVICE_TYPE" /> funkce svého telefonu</translation> <translation id="8217399928341212914">I nadále blokovat automatické stahování několika souborů</translation> +<translation id="822050276545350872">Už žádné čekání</translation> <translation id="8221491193165283816">Obvykle oznámení blokujete. Chcete-li tomuto webu zobrazování oznámení povolit, klikněte sem.</translation> <translation id="822347941086490485">Hledání zařízení HID…</translation> <translation id="8225046344534779393">Zkontrolujte připojení k internetu</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 57321559..9cccb13 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -887,6 +887,7 @@ <translation id="1823098433522728610">Mae gan y ddogfen hon gynnwys sensitif.</translation> <translation id="18245044880483936">Ni fydd data wrth gefn yn cyfrif tuag at gwota storfa Drive eich plentyn.</translation> <translation id="1825565032302550710">Rhaid i'r porth fod rhwng 1024 a 65535</translation> +<translation id="182577151972096764">ryseitiau a welwyd yn ddiweddar</translation> <translation id="1826192255355608658">Cysoni eich nodau tudalen Chrome, cyfrineiriau, hanes a rhagor</translation> <translation id="1826516787628120939">Wrthi'n gwirio</translation> <translation id="1827738518074806965">Oriel gelf</translation> @@ -1321,6 +1322,7 @@ <translation id="2241053333139545397">Darllen a newid eich data ar nifer o wefannau</translation> <translation id="2241634353105152135">Unwaith yn unig</translation> <translation id="2242687258748107519">Gwybodaeth am y Ffeil</translation> +<translation id="2246129643805925002">Mae eich <ph name="DEVICE_TYPE" /> yn diweddaru'n awtomatig yn y cefndir i roi'r nodweddion diweddaraf a gwelliannau diogelwch i chi. Gallwch adolygu dewisiadau diweddaru yn y Gosodiadau.</translation> <translation id="2246549592927364792">Cael disgrifiadau o luniau gan Google?</translation> <translation id="2247738527273549923">Rheolir eich dyfais gan eich sefydliad</translation> <translation id="2249111429176737533">Ar agor fel ffenestr mewn tab</translation> @@ -1613,6 +1615,7 @@ <translation id="249113932447298600">Mae'n ddrwg gennym, nid yw'r ddyfais <ph name="DEVICE_LABEL" /> yn cael ei chefnogi ar hyn o bryd.</translation> <translation id="2492461744635776704">Wrthi'n paratoi cais llofnodi tystysgrif</translation> <translation id="2493126929778606526">Eich lluniau gorau, wedi'u dewis yn awtomatig</translation> +<translation id="2495524171012645395">Ryseitiau a welwyd yn ddiweddar</translation> <translation id="2496180316473517155">Hanes pori</translation> <translation id="2497229222757901769">Cyflymder y llygoden</translation> <translation id="2497852260688568942">Mae Cysoni wedi'i analluogi gan eich gweinyddwr</translation> @@ -3432,6 +3435,7 @@ <translation id="4289732974614035569">Dewiswch PIN</translation> <translation id="4290791284969893584">Ar ôl cau tudalen, mae'n bosib na fydd y tasgau y gwnaethoch eu cychwyn yn gorffen</translation> <translation id="4291265871880246274">Deialog Mewngofnodi</translation> +<translation id="429234155571566255">y ryseitiau hyn a welwyd yn ddiweddar</translation> <translation id="4295072614469448764">Mae'r ap ar gael yn eich terfynell. Mae'n bosib y bydd eicon yn eich Lansiwr hefyd.</translation> <translation id="4295979599050707005">Mewngofnodwch eto i gadarnhau y gellir defnyddio'ch cyfrif <ph name="USER_EMAIL" /> gyda gwefannau, apiau ac estyniadau yn Chrome a Google Play. Gallwch hefyd dynnu'r cyfrif hwn. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Ailgychwyn ac ailosod</translation> @@ -3492,6 +3496,7 @@ <translation id="435527878592612277">Dewiswch eich llun</translation> <translation id="4358302248024731679">Er mwyn gwneud diagnosis gwell o broblemau Bluetooth, gall defnyddwyr Google gynnwys logiau Bluetooth ychwanegol gyda'u hadroddiadau adborth. Pan fydd yr opsiwn hwn wedi'i dicio, bydd eich adroddiad yn cynnwys logiau btsnoop a HCI o'ch sesiwn bresennol, wedi'u glanweithio i gael gwared ar gymaint o PII â phosib. Cyfyngir mynediad at y logiau hyn i reolwyr grŵp cynhyrchion ChromeOS yn Listnr. Bydd logiau'n cael eu gwaredu ar ôl 90 diwrnod.</translation> <translation id="4358313196493694334">Sefydlogi lleoliad clicio</translation> +<translation id="4358643842961018282">Mae eich dyfais yn gyfredol</translation> <translation id="4359408040881008151">Wedi'i osod oherwydd estyniad(au) dibynnol.</translation> <translation id="4359717112757026264">Dinaswedd</translation> <translation id="4361142739114356624">Mae'r Allwedd Breifat ar gyfer y Dystysgrif Cleient hon ar goll neu'n annilys</translation> @@ -4785,7 +4790,6 @@ <translation id="5658415415603568799">I fod yn fwy diogel, bydd Smart Lock yn gofyn i chi roi eich cyfrinair ar ôl 20 awr.</translation> <translation id="5659593005791499971">E-bost</translation> <translation id="5659833766619490117">Ni ellid cyfieithu'r dudalen hon</translation> -<translation id="566097169318652001">Mae'n bosib na fydd eich dyfais yn gweithio'n iawn mwyach, ac mae'n bosib y byddwch yn profi problemau diogelwch a pherfformiad. Mae'n bosib y bydd nodweddion allweddol yn eich apiau'n stopio gweithio hefyd pan fyddant yn mynd yn hen a byddwch yn colli'ch hawl i wneud hawliadau cyfreithiol.</translation> <translation id="5662513737565158057">Newid sut y bydd apiau Linux yn gweithio.</translation> <translation id="5667293444945855280">Drwgwedd</translation> <translation id="5667546120811588575">Wrthi'n gosod Google Play...</translation> @@ -6110,7 +6114,6 @@ <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> -<translation id="6974609594866392343">Modd demo all-lein</translation> <translation id="697508444536771064">Diffodd Linux</translation> <translation id="6978121630131642226">Peiriannau Chwilio</translation> <translation id="6979044105893951891">Lansio a gadael sesiynau gwestai a reolir</translation> @@ -7130,6 +7133,7 @@ <translation id="7981313251711023384">Llwytho tudalennau ymlaen llaw i'w pori a'u chwilio'n gyflymach</translation> <translation id="798145602633458219">Atodi'r awgrym <ph name="SUGGESTION_NAME" /> i'w blwch chwilio</translation> <translation id="7981662863948574132">Ffenestr naid dangos EID a Chod QR dyfais</translation> +<translation id="7981670705071137488">Ar ôl hyn, bydd diweddariadau meddalwedd yn digwydd yn y cefndir. Gallwch adolygu dewisiadau diweddaru yn y Gosodiadau.</translation> <translation id="7982083145464587921">Ailddechreuwch eich dyfais i drwsio'r gwall hwn.</translation> <translation id="7982789257301363584">Rhwydwaith</translation> <translation id="7984068253310542383">Adlewyrchu <ph name="DISPLAY_NAME" /></translation> @@ -7373,6 +7377,7 @@ <translation id="8214489666383623925">Agor Ffeil...</translation> <translation id="8215129063232901118">Cael mynediad at alluoedd eich ffôn o'ch <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Parhau i rwystro lawrlwytho mwy nag un ffeil yn awtomatig</translation> +<translation id="822050276545350872">O hyn ymlaen, dim angen aros</translation> <translation id="8221491193165283816">Rydych fel arfer yn rhwystro hysbysiadau. I ganiatáu i'r wefan hon eich hysbysu, cliciwch yma.</translation> <translation id="822347941086490485">Wrthi'n dod o hyd i ddyfeisiau HID...</translation> <translation id="8225046344534779393">Gwirio'r cysylltiad rhyngrwyd</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index b5dbd44..a4e4293 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -4788,7 +4788,6 @@ <translation id="5658415415603568799">Af sikkerhedshensyn beder Smart Lock dig om at angive din adgangskode efter 20 timer.</translation> <translation id="5659593005791499971">Mail</translation> <translation id="5659833766619490117">Denne side kunne ikke oversættes</translation> -<translation id="566097169318652001">Din enhed fungerer muligvis ikke længere korrekt, og du kan opleve problemer med sikkerheden og ydeevnen. Vigtige funktion i dine apps kan også holde op med at fungere, når de bliver forældet, og du mister retten til at indgive juridiske krav.</translation> <translation id="5662513737565158057">Skift indstillingerne for, hvordan Linux-apps fungerer.</translation> <translation id="5667293444945855280">Malware</translation> <translation id="5667546120811588575">Konfigurerer Google Play...</translation> @@ -5642,6 +5641,7 @@ <translation id="6520876759015997832">Søgeresultat <ph name="LIST_POSITION" /> af <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Tryk på Enter for at gå til sektionen.</translation> <translation id="6521214596282732365">Websites bruger som regel dine skrifttyper, så du kan oprette indhold i høj kvalitet med design- og grafikværktøjer online</translation> <translation id="6523303810310758032">Når du sletter din browserhistorik – det hele eller for et specifikt website – sletter du også de tilhørende målingsoplysninger. Se <ph name="BEGIN_LINK" />din browserhistorik<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Google Adgangskodeadministrator kunne ikke gemme disse adgangskoder på din Google-konto. Du kan gemme dem på denne enhed.</translation> <translation id="6524735478670290456">Sådan bruger vi dataene:</translation> <translation id="652492607360843641">Du har oprettet forbindelse til et <ph name="NETWORK_TYPE" />-netværk.</translation> <translation id="6527303717912515753">Del</translation> @@ -5948,6 +5948,7 @@ <translation id="6818198425579322765">Sidens sprog, som skal oversættes</translation> <translation id="6818547713623251698">Se din telefons billeder, mediefiler, notifikationer og apps</translation> <translation id="6818802132960437751">Indbygget virusbeskyttelse</translation> +<translation id="6818920801736417483">Vil du gemme adgangskoderne?</translation> <translation id="6823174134746916417">Tryk-hurtigt-for-at-klikke på touchplade</translation> <translation id="6824564591481349393">Kopier mailadress&e</translation> <translation id="6824584962142919697">&Inspect elements (Undersøg elementer)</translation> @@ -6107,7 +6108,6 @@ <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> -<translation id="6974609594866392343">Offline demotilstand</translation> <translation id="697508444536771064">Luk Linux</translation> <translation id="6978121630131642226">Søgemaskiner</translation> <translation id="6979044105893951891">Start og afslut administrerede gæstesessioner</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 9f2d4960..84bb453b 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -131,6 +131,7 @@ <translation id="1124772482545689468">Nutzer</translation> <translation id="1125550662859510761">Auflösung <ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativ)</translation> <translation id="1126809382673880764">Du wirst nicht vor schädlichen Websites, Downloads und Erweiterungen geschützt. Sofern verfügbar, bist du in anderen Google-Diensten, wie Gmail und der Google Suche, durch Safe Browsing geschützt.</translation> +<translation id="1128090040635299943">Linux wird jetzt konfiguriert. Die Konfiguration wird einige Minuten dauern.</translation> <translation id="1128591060186966949">Suchmaschine bearbeiten</translation> <translation id="1129420403709586868">Fotos und Medien von deinem Smartphone abrufen</translation> <translation id="1129850422003387628">Apps verwalten</translation> @@ -332,6 +333,7 @@ <translation id="1327794256477341646">Funktionen, die deinen Standort benötigen, funktionieren dann nicht</translation> <translation id="1329191040029425999">Achte darauf, dass dein Gerät auf dem neuesten Stand ist, und versuche es noch einmal</translation> <translation id="1330145147221172764">Bildschirmtastatur aktivieren</translation> +<translation id="1331625853030156663">Um <ph name="APP_NAME" /> zu öffnen, aktiviere „Sperrbildschirm anzeigen, wenn der Ruhemodus beendet wird“</translation> <translation id="1331977651797684645">Das war ich.</translation> <translation id="1333489022424033687">Einige Funkionen auf <ph name="ORIGIN" /> funktionieren möglicherweise erst, wenn du Daten löschst, die durch andere Websites auf deinem Gerät gespeichert wurden</translation> <translation id="1333965224356556482">Websites dürfen meinen Standort nicht sehen</translation> @@ -870,6 +872,7 @@ <translation id="1823098433522728610">Dieses Dokument enthält sensible Inhalte.</translation> <translation id="18245044880483936">Sicherungsdaten werden nicht auf das Google Drive-Speicherkontingent deines Kindes angerechnet.</translation> <translation id="1825565032302550710">Port muss zwischen 1024 und 65535 liegen</translation> +<translation id="182577151972096764">Kürzlich angesehene Rezepte</translation> <translation id="1826192255355608658">Lesezeichen, Passwörter, Verlauf und mehr in deinem Chrome-Browser synchronisieren</translation> <translation id="1826516787628120939">Überprüfung läuft</translation> <translation id="1827738518074806965">Kunstgalerie</translation> @@ -1303,6 +1306,7 @@ <translation id="2241053333139545397">Eigene Daten auf verschiedenen Websites lesen und ändern</translation> <translation id="2241634353105152135">Nur einmal</translation> <translation id="2242687258748107519">Dateiinformationen</translation> +<translation id="2246129643805925002">Dein <ph name="DEVICE_TYPE" /> wird automatisch im Hintergrund aktualisiert, sodass du die neuesten Funktionen und Sicherheitsverbesserungen nutzen kannst. Die Updateeinstellungen kannst du dir in den Einstellungen ansehen.</translation> <translation id="2246549592927364792">Bildbeschreibungen von Google verwenden?</translation> <translation id="2247738527273549923">Dein Gerät wird von deiner Organisation verwaltet</translation> <translation id="2249111429176737533">Als Tab-Fenster öffnen</translation> @@ -1592,6 +1596,7 @@ <translation id="249113932447298600">Das Gerät <ph name="DEVICE_LABEL" /> wird derzeit nicht unterstützt.</translation> <translation id="2492461744635776704">Zertifikatssignaturanfrage wird vorbereitet</translation> <translation id="2493126929778606526">Meine besten automatisch ausgewählten Fotos</translation> +<translation id="2495524171012645395">Kürzlich angesehene Rezepte</translation> <translation id="2496180316473517155">Browserverlauf</translation> <translation id="2497229222757901769">Mausgeschwindigkeit</translation> <translation id="2497852260688568942">Die Synchronisierung wurde von deinem Administrator deaktiviert</translation> @@ -3325,6 +3330,7 @@ <translation id="420283545744377356">Bildschirmschoner deaktivieren</translation> <translation id="4203065553461038553">Dateiname oder Speicherort zu lang</translation> <translation id="4204851595694839599">Wie war das Gameplay?</translation> +<translation id="4205157409548006256">Bei der Konfiguration von Linux ist ein Fehler aufgetreten.</translation> <translation id="4206144641569145248">Außerirdischer</translation> <translation id="4206323443866416204">Feedbackbericht</translation> <translation id="4207522141889799150">Websiteberechtigungen für <ph name="SITE" /> bearbeiten</translation> @@ -3411,6 +3417,7 @@ <translation id="4289732974614035569">PIN auswählen</translation> <translation id="4290791284969893584">Nach dem Schließen einer Seite werden Aufgaben, die du gestartet hast, möglicherweise nicht abgeschlossen</translation> <translation id="4291265871880246274">Dialogfeld zur Anmeldung</translation> +<translation id="429234155571566255">Diese kürzlich angesehenen Rezepte</translation> <translation id="4295072614469448764">Die App ist in deinem Terminal verfügbar. Möglicherweise siehst du auch ein Symbol in deinem Launcher.</translation> <translation id="4295979599050707005">Bitte melde dich noch einmal an und bestätige so, dass dein Konto <ph name="USER_EMAIL" /> mit Websites, Apps und Erweiterungen in Chrome und bei Google Play verwendet werden darf. Du kannst dieses Konto auch entfernen. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Neu starten und zurücksetzen</translation> @@ -3471,6 +3478,7 @@ <translation id="435527878592612277">Foto auswählen</translation> <translation id="4358302248024731679">Damit Bluetooth-Probleme besser diagnostiziert werden können, haben Google-Mitarbeiter die Möglichkeit, Feedbackberichte durch zusätzliche Bluetooth-Protokolle zu ergänzen. Wenn diese Option ausgewählt ist, enthält dein Bericht btsnoop- und HCI-Protokolle der aktuellen Sitzung. Personenidentifizierbare Informationen werden dabei so gut wie möglich entfernt. Nur die Administratoren der entsprechenden Chrome OS-Produktgruppe in Listnr haben Zugriff auf die Protokolle. Diese werden nach 90 Tagen dauerhaft gelöscht.</translation> <translation id="4358313196493694334">Klickposition stabilisieren</translation> +<translation id="4358643842961018282">Dein Gerät ist auf dem neuesten Stand</translation> <translation id="4359408040881008151">Wurde aufgrund der abhängigen Erweiterungen installiert</translation> <translation id="4359717112757026264">Stadtlandschaft</translation> <translation id="4361142739114356624">Der private Schlüssel für dieses Clientzertifikat fehlt oder ist ungültig</translation> @@ -4761,7 +4769,6 @@ <translation id="5658415415603568799">Aus Sicherheitsgründen wirst du von Smart Lock gebeten, dein Passwort nach 20 Stunden noch einmal einzugeben.</translation> <translation id="5659593005791499971">E-Mail</translation> <translation id="5659833766619490117">Diese Seite konnte nicht übersetzt werden</translation> -<translation id="566097169318652001">Dein Gerät funktioniert dann möglicherweise nicht mehr richtig und es können Sicherheits- und Leistungsprobleme auftreten. Außerdem kann es passieren, dass wichtige Funktionen deiner Apps nicht mehr genutzt werden können, da sie veraltet sind, und du deinen Anspruch verlierst, rechtliche Forderungen zu stellen.</translation> <translation id="5662513737565158057">Hier kannst du ändern, wie Linux-Apps ausgeführt werden.</translation> <translation id="5667293444945855280">Malware</translation> <translation id="5667546120811588575">Google Play wird eingerichtet...</translation> @@ -5784,6 +5791,7 @@ <translation id="6686665106869989887">Tab wurde nach rechts verschoben</translation> <translation id="6686817083349815241">Passwort speichern</translation> <translation id="6687079240787935001"><ph name="MODULE_TITLE" /> ausblenden</translation> +<translation id="6688391094668641513">Anfordern, <ph name="ORIGIN" /> aufzurufen und Änderungen vorzunehmen:</translation> <translation id="6689714331348768690">Bitte <ph name="SUPERVISED_USER_NAME" />, an den Computer zu kommen. Dein Kind muss einige Sätze auf diesem Bildschirm vorlesen, damit sein Sprachmodell erstellt werden kann. <ph name="BR" /> Falls <ph name="SUPERVISED_USER_NAME" /> Hilfe beim Lesen braucht, lies vor und lasse dein Kind den Text wiederholen. Flüstere dabei und sprich nicht in Richtung des Mikrofons, damit Assistant die Stimme deines Kindes lernt und nicht deine.</translation> @@ -6077,7 +6085,6 @@ <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> -<translation id="6974609594866392343">Offline-Demomodus</translation> <translation id="697508444536771064">Linux herunterfahren</translation> <translation id="6978121630131642226">Suchmaschinen</translation> <translation id="6979044105893951891">Verwaltete Gastsitzungen starten und beenden</translation> @@ -6296,6 +6303,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Seite verlassen}other{Seiten verlassen}}</translation> <translation id="7207457272187520234">Du hast die Möglichkeit, Nutzungsdaten & Fehlerberichte zu senden. Dieses Gerät sendet momentan automatisch Diagnose- und Gerätedaten sowie App-Nutzungsdaten an Google. Die Daten helfen unter anderem dabei, die Stabilität des Systems und der Apps zu verbessern. Einige aggregierte Daten sind auch für Apps und Partner von Google nützlich, beispielsweise Android-Entwickler. Diese Einstellung wird vom Inhaber erzwungen. Wenn die Einstellung "Zusätzliche Web- & App-Aktivitäten" aktiviert ist, werden diese Daten möglicherweise in deinem Google-Konto gespeichert.</translation> <translation id="7207631048330366454">Apps finden</translation> +<translation id="720808544705441386">App kann nicht geöffnet werden</translation> <translation id="7210499381659830293">Erweiterungsdrucker</translation> <translation id="7211783048245131419">Es wurde noch keine Schaltertaste zugewiesen</translation> <translation id="7212097698621322584">Gib deine aktuelle PIN ein, um sie zu ändern. Falls du deine PIN nicht kennst, musst du den Sicherheitsschlüssel zurücksetzen und dann eine neue PIN erstellen.</translation> @@ -7096,6 +7104,7 @@ <translation id="7981313251711023384">Seiten vorab laden, um das Surfen und die Suche zu beschleunigen</translation> <translation id="798145602633458219">Vorschlag "<ph name="SUGGESTION_NAME" />" ins Suchfeld übernehmen</translation> <translation id="7981662863948574132">Pop-up mit Geräte-EID und QR-Code anzeigen</translation> +<translation id="7981670705071137488">Nach diesem Update finden alle weiteren Softwareupdates im Hintergrund statt. Die Updateeinstellungen kannst du dir in den Einstellungen ansehen.</translation> <translation id="7982083145464587921">Starte dein Gerät neu, um den Fehler zu beheben.</translation> <translation id="7982789257301363584">Netzwerk</translation> <translation id="7984068253310542383"><ph name="DISPLAY_NAME" /> spiegeln</translation> @@ -7340,6 +7349,7 @@ <translation id="8214489666383623925">Datei öffnen...</translation> <translation id="8215129063232901118">Auf deinem <ph name="DEVICE_TYPE" /> auf die Funktionen deines Smartphones zugreifen</translation> <translation id="8217399928341212914">Weiterhin automatisches Herunterladen mehrerer Dateien blockieren</translation> +<translation id="822050276545350872">Ab jetzt ist Schluss mit Warten</translation> <translation id="8221491193165283816">Normalerweise blockierst du Benachrichtigungen. Klicke hier, wenn du von dieser Website Benachrichtigungen erhalten möchtest.</translation> <translation id="822347941086490485">HID-Geräte werden gesucht…</translation> <translation id="8225046344534779393">Internetverbindung prüfen</translation> @@ -7450,6 +7460,7 @@ <translation id="8324784016256120271">Websites können Cookies verwenden, um deine Browseraktivitäten auf anderen Websites aufzuzeichnen und damit zum Beispiel Werbung zu personalisieren</translation> <translation id="8325413836429495820">Dürfen nicht auf meine Zwischenablage zugreifen</translation> <translation id="8326478304147373412">PKCS #7, Zertifikatkette</translation> +<translation id="8327386430364625757">Mathematische Schriftart</translation> <translation id="8327676037044516220">Berechtigungen und Inhaltseinstellungen</translation> <translation id="8330617762701840933">Die Liste mit Websites, die zum alternativen Browser weiterleiten.</translation> <translation id="8330689128072902965">Kontakte in der Nähe können Inhalte mit dir teilen. Zum Ändern klicken.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 55681d2..e7329cf 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -4788,7 +4788,6 @@ <translation id="5658415415603568799">Για πρόσθετη ασφάλεια, το Smart Lock θα σας ζητήσει να καταχωρίσετε τον κωδικό πρόσβασης μετά από 20 ώρες.</translation> <translation id="5659593005791499971">Ηλεκτρονικό ταχυδρομείο</translation> <translation id="5659833766619490117">Δεν ήταν δυνατή η μετάφραση αυτής της σελίδας</translation> -<translation id="566097169318652001">Η συσκευή σας ενδέχεται να μην λειτουργεί σωστά πλέον και ίσως αντιμετωπίσετε ζητήματα ασφάλειας και απόδοσης. Επίσης, κάποιες βασικές λειτουργίες στις εφαρμογές σας ενδέχεται να διακοπούν αν δεν ενημερωθούν και θα χάσετε το δικαίωμα υποβολής νομικών αξιώσεων.</translation> <translation id="5662513737565158057">Αλλαγή του τρόπου λειτουργίας των εφαρμογών Linux.</translation> <translation id="5667293444945855280">Κακόβουλο πρόγραμμα</translation> <translation id="5667546120811588575">Ρύθμιση του Google Play…</translation> @@ -5642,6 +5641,7 @@ <translation id="6520876759015997832">Αποτέλεσμα αναζήτησης <ph name="LIST_POSITION" /> από <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Πατήστε Enter για να μεταβείτε στην ενότητα.</translation> <translation id="6521214596282732365">Οι ιστότοποι συνήθως χρησιμοποιούν τις γραμματοσειρές σας, έτσι ώστε να μπορείτε να δημιουργείτε περιεχόμενο υψηλής πιστότητας με εργαλεία σχεδίασης και επεξεργασίας γραφικών στο διαδίκτυο.</translation> <translation id="6523303810310758032">Όταν διαγράφετε το ιστορικό περιήγησής σας, ολόκληρο ή για έναν συγκεκριμένο ιστότοπο, διαγράφετε επίσης τις συσχετισμένες πληροφορίες μέτρησης. Δείτε το <ph name="BEGIN_LINK" />ιστορικό περιήγησής σας<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Ο Διαχειριστής κωδικών πρόσβασης Google δεν κατάφερε να αποθηκεύσει αυτούς τους κωδικούς πρόσβασης στον Λογαριασμό σας Google. Μπορείτε να τους αποθηκεύσετε σε αυτήν τη συσκευή.</translation> <translation id="6524735478670290456">Πώς χρησιμοποιούμε αυτά τα δεδομένα:</translation> <translation id="652492607360843641">Έχετε συνδεθεί σε ένα δίκτυο <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Κοινοποίηση</translation> @@ -5946,6 +5946,7 @@ <translation id="6818198425579322765">Γλώσσα σελίδας προς μετάφραση</translation> <translation id="6818547713623251698">Δείτε τις φωτογραφίες, τα πολυμέσα, τις ειδοποιήσεις και τις εφαρμογές του τηλεφώνου σας.</translation> <translation id="6818802132960437751">Ενσωματωμένη προστασία από ιούς</translation> +<translation id="6818920801736417483">Αποθήκευση κωδικών πρόσβασης;</translation> <translation id="6823174134746916417">Άγγιγμα για κλικ οθόνης αφής</translation> <translation id="6824564591481349393">Αντιγραφή Διεύθυνσης &Ηλεκτρονικού Ταχυδρομείου</translation> <translation id="6824584962142919697">&Inspect elements</translation> @@ -6105,7 +6106,6 @@ <translation id="697312151395002334">Επιτρέπεται να αποστέλλουν αναδυόμενα παράθυρα και να χρησιμοποιούν ανακατευθύνσεις</translation> <translation id="6973611239564315524">Υπάρχει διαθέσιμη αναβάθμιση σε Debian 10 (Buster)</translation> <translation id="69739764870135975">Εάν το Google είναι και η προεπιλεγμένη μηχανή αναζήτησης, θα βλέπετε καλύτερες προτάσεις που είναι σχετικές με τα συμφραζόμενα.</translation> -<translation id="6974609594866392343">Λειτουργία επίδειξης εκτός σύνδεσης</translation> <translation id="697508444536771064">Τερματισμός λειτουργίας Linux</translation> <translation id="6978121630131642226">Μηχανές αναζήτησης</translation> <translation id="6979044105893951891">Εκκίνηση και έξοδος διαχειριζόμενων περιόδων λειτουργίας επισκέπτη</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 4362f94..bb2fbfd 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1968,6 +1968,7 @@ <translation id="2832124733806557606">Your child can use a PIN to sign in to or unlock the device.</translation> <translation id="2835177225987815960">Your current scanning setup will be reset, including any assigned switches and auto-scan speed preferences.</translation> <translation id="2835547721736623118">Speech recognition service</translation> +<translation id="2836232638504556905">To continue, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> will share your name, email address and profile picture with this site. See this site's <ph name="BEGIN_LINK" />privacy policy<ph name="END_LINK" />.</translation> <translation id="2836269494620652131">Crash</translation> <translation id="2836635946302913370">Signing in with this username has been disabled by your administrator.</translation> <translation id="283669119850230892">To use the network <ph name="NETWORK_ID" />, first complete your connection to the Internet below.</translation> @@ -2249,6 +2250,7 @@ <translation id="3105796011181310544">Change back to Google?</translation> <translation id="310671807099593501">Site is using Bluetooth</translation> <translation id="3108931485517391283">Can't receive</translation> +<translation id="3109206895301430738">Saved tab groups</translation> <translation id="3109724472072898302">Collapsed</translation> <translation id="311214366526552035">Download anyway</translation> <translation id="3112292765614504292">App size: <ph name="APP_SIZE" /></translation> @@ -4787,7 +4789,6 @@ <translation id="5658415415603568799">For added security, Smart Lock will ask you to enter your password after 20 hours.</translation> <translation id="5659593005791499971">Email</translation> <translation id="5659833766619490117">This page could not be translated</translation> -<translation id="566097169318652001">Your device may no longer work properly, and you may experience security and performance issues. Key features in your apps may also stop working when they become outdated and you’ll lose your right to make legal claims.</translation> <translation id="5662513737565158057">Change how Linux apps will work.</translation> <translation id="5667293444945855280">Malware</translation> <translation id="5667546120811588575">Setting up Google Play…</translation> @@ -6106,7 +6107,6 @@ <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> -<translation id="6974609594866392343">Offline demo mode</translation> <translation id="697508444536771064">Shut down Linux</translation> <translation id="6978121630131642226">Search Engines</translation> <translation id="6979044105893951891">Launch and exit managed guest sessions</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 085add2..85fcf88 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -870,6 +870,7 @@ <translation id="1823098433522728610">Este documento tiene contenido sensible.</translation> <translation id="18245044880483936">Los datos de la copia de seguridad no inciden en la cuota de almacenamiento en Drive de tu hijo.</translation> <translation id="1825565032302550710">El número de puerto debe estar entre 1024 y 65535</translation> +<translation id="182577151972096764">las recetas que viste recientemente</translation> <translation id="1826192255355608658">Sincroniza los favoritos, las contraseñas, el historial y otros elementos de tu navegador Chrome</translation> <translation id="1826516787628120939">Comprobando</translation> <translation id="1827738518074806965">Galería de arte</translation> @@ -1303,6 +1304,7 @@ <translation id="2241053333139545397">Leer y modificar tus datos en una serie de sitios web</translation> <translation id="2241634353105152135">Solo esta vez</translation> <translation id="2242687258748107519">Información del archivo</translation> +<translation id="2246129643805925002">Tu <ph name="DEVICE_TYPE" /> se actualiza automáticamente en segundo plano para brindarte las funciones y las mejoras de seguridad más recientes. Puedes revisar las preferencias de actualización en la Configuración.</translation> <translation id="2246549592927364792">¿Quieres obtener descripciones de imágenes de Google?</translation> <translation id="2247738527273549923">Tu organización administra este dispositivo.</translation> <translation id="2249111429176737533">Abrir como ventana con pestañas</translation> @@ -1592,6 +1594,7 @@ <translation id="249113932447298600">Lo sentimos, el dispositivo <ph name="DEVICE_LABEL" /> no se admite en este momento.</translation> <translation id="2492461744635776704">Preparando la solicitud de firma del certificado</translation> <translation id="2493126929778606526">Tus mejores fotos seleccionadas automáticamente</translation> +<translation id="2495524171012645395">Recetas que viste recientemente</translation> <translation id="2496180316473517155">Historial de navegación</translation> <translation id="2497229222757901769">Velocidad del mouse</translation> <translation id="2497852260688568942">Tu administrador inhabilitó la sincronización</translation> @@ -3411,6 +3414,7 @@ <translation id="4289732974614035569">Elige un PIN</translation> <translation id="4290791284969893584">Después de cerrar una página, es posible que no puedas completar las tareas que empezaste.</translation> <translation id="4291265871880246274">Diálogo de acceso</translation> +<translation id="429234155571566255">las recetas que viste recientemente</translation> <translation id="4295072614469448764">La app está disponible en tu terminal. Es posible que haya un ícono en el Selector.</translation> <translation id="4295979599050707005">Vuelve a acceder para confirmar que tu cuenta <ph name="USER_EMAIL" /> se puede usar con sitios web, apps y extensiones en Chrome y Google Play. También puedes quitarla. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Reiniciar y restablecer</translation> @@ -3471,6 +3475,7 @@ <translation id="435527878592612277">Seleccionar tu foto</translation> <translation id="4358302248024731679">Para diagnosticar mejor los problemas de Bluetooth, los empleados de Google pueden incluir registros de Bluetooth adicionales en sus informes de respuesta. Si se selecciona esta opción, tu informe incluirá registros de btsnoop y HCI de tu sesión actual editados para quitar la mayor cantidad posible de información de identificación personal. Solo los gerentes del grupo del producto Chrome OS tienen acceso a estos registros en Listnr. Los registros se borrarán definitivamente después de 90 días.</translation> <translation id="4358313196493694334">Estabiliza la posición del cursor</translation> +<translation id="4358643842961018282">El dispositivo está actualizado</translation> <translation id="4359408040881008151">Instalada a causa de las extensiones dependientes</translation> <translation id="4359717112757026264">Paisaje urbano</translation> <translation id="4361142739114356624">Falta la clave privada para este Certificado de cliente o no es válida</translation> @@ -4763,7 +4768,6 @@ <translation id="5658415415603568799">Para mejorar la seguridad, Smart Lock te pedirá que ingreses tu contraseña después de 20 horas.</translation> <translation id="5659593005791499971">Correo</translation> <translation id="5659833766619490117">No se pudo traducir esta página</translation> -<translation id="566097169318652001">Es posible que el dispositivo ya no funcione de manera adecuada y que tengas problemas de seguridad y rendimiento. Es posible que las funciones clave de tus apps dejen de funcionar cuando queden desactualizadas, y perderás el derecho a hacer demandas legales.</translation> <translation id="5662513737565158057">Cambia la manera en la que funcionan las apps de Linux.</translation> <translation id="5667293444945855280">Software malicioso</translation> <translation id="5667546120811588575">Configurando Google Play…</translation> @@ -6080,7 +6084,6 @@ <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> -<translation id="6974609594866392343">Modo de demostración sin conexión</translation> <translation id="697508444536771064">Cerrar Linux</translation> <translation id="6978121630131642226">Motores de búsqueda</translation> <translation id="6979044105893951891">Inicia las sesiones de invitado administradas y sal de ellas</translation> @@ -7100,6 +7103,7 @@ <translation id="7981313251711023384">Precargar las páginas para acelerar la navegación y las búsquedas</translation> <translation id="798145602633458219">Agregar la sugerencia <ph name="SUGGESTION_NAME" /> al cuadro de búsqueda</translation> <translation id="7981662863948574132">Mostrar la ventana emergente del código QR y del EID del dispositivo</translation> +<translation id="7981670705071137488">De ahora en adelante, las actualizaciones de software se realizarán en segundo plano. Puedes revisar las preferencias de actualización en la Configuración.</translation> <translation id="7982083145464587921">Reinicia el dispositivo para corregir el error.</translation> <translation id="7982789257301363584">Red</translation> <translation id="7984068253310542383">Duplicar <ph name="DISPLAY_NAME" /></translation> @@ -7344,6 +7348,7 @@ <translation id="8214489666383623925">Abrir archivo...</translation> <translation id="8215129063232901118">Accede a las funciones del teléfono desde tu <ph name="DEVICE_TYPE" />.</translation> <translation id="8217399928341212914">Seguir bloqueando las descargas automáticas de varios archivos</translation> +<translation id="822050276545350872">A partir de ahora, no tendrás que esperar</translation> <translation id="8221491193165283816">Por lo general, bloqueas las notificaciones. Si quieres permitir que este sitio las muestre, haz clic aquí.</translation> <translation id="822347941086490485">Buscando dispositivos HID…</translation> <translation id="8225046344534779393">Comprueba la conexión a Internet.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 2e95232..ba3d24f 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -873,6 +873,7 @@ <translation id="1823098433522728610">Este documento incluye contenido sensible.</translation> <translation id="18245044880483936">Los datos de la copia de seguridad no se tienen en cuenta para calcular el espacio de Almacenamiento en Drive de tu hijo.</translation> <translation id="1825565032302550710">El número de puerto debe estar entre 1024 y 65535</translation> +<translation id="182577151972096764">recetas vistas recientemente</translation> <translation id="1826192255355608658">Sincroniza tus marcadores, tus contraseñas y tu historial de Chrome, entre otros elementos</translation> <translation id="1826516787628120939">Comprobando</translation> <translation id="1827738518074806965">Galería de arte</translation> @@ -1306,6 +1307,7 @@ <translation id="2241053333139545397">Leer y modificar tus datos en una serie de sitios web</translation> <translation id="2241634353105152135">Solo una vez</translation> <translation id="2242687258748107519">Información del archivo</translation> +<translation id="2246129643805925002">Tu <ph name="DEVICE_TYPE" /> se actualiza automáticamente en segundo plano para que disfrutes de las últimas funciones y mejoras de seguridad. Puedes revisar tus preferencias de actualización en Configuración.</translation> <translation id="2246549592927364792">¿Quieres obtener descripciones de imágenes de Google?</translation> <translation id="2247738527273549923">Tu organización gestiona tu dispositivo.</translation> <translation id="2249111429176737533">Abrir como ventana con pestañas</translation> @@ -1596,6 +1598,7 @@ <translation id="249113932447298600">Lo sentimos, pero el dispositivo <ph name="DEVICE_LABEL" /> no se admite en este momento.</translation> <translation id="2492461744635776704">Preparando solicitud de firma de certificado</translation> <translation id="2493126929778606526">Tus mejores fotos, seleccionadas automáticamente</translation> +<translation id="2495524171012645395">Recetas vistas recientemente</translation> <translation id="2496180316473517155">Historial de navegación</translation> <translation id="2497229222757901769">Velocidad del ratón</translation> <translation id="2497852260688568942">El administrador ha inhabilitado la sincronización</translation> @@ -3413,6 +3416,7 @@ <translation id="4289732974614035569">Elige un PIN</translation> <translation id="4290791284969893584">Después de que cierres una página, es posible que no se completen las tareas que hayas iniciado</translation> <translation id="4291265871880246274">Cuadro de diálogo de inicio de sesión</translation> +<translation id="429234155571566255">estas recetas vistas recientemente</translation> <translation id="4295072614469448764">La aplicación está disponible en tu terminal. Es posible que también haya un icono en el menú de aplicaciones.</translation> <translation id="4295979599050707005">Vuelve a iniciar sesión para confirmar que tu cuenta <ph name="USER_EMAIL" /> se puede usar con sitios web, aplicaciones y extensiones tanto en Chrome como en Google Play. También puedes quitar esta cuenta. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Reiniciar y restablecer</translation> @@ -3473,6 +3477,7 @@ <translation id="435527878592612277">Selecciona una foto</translation> <translation id="4358302248024731679">Para diagnosticar mejor los problemas de Bluetooth, los Googlers pueden incluir registros de Bluetooth adicionales en sus comentarios. Si seleccionas esta opción, tu informe contendrá registros btsnoop y HCI de la sesión actual modificados para retirar tanta información personal identificable como sea posible. Solo los administradores del grupo de productos de ChromeOS de Listnr podrán acceder a estos registros, que se eliminarán definitivamente después de 90 días.</translation> <translation id="4358313196493694334">Estabilizar ubicación de clic</translation> +<translation id="4358643842961018282">El dispositivo está actualizado</translation> <translation id="4359408040881008151">Instalada debido a las extensiones dependientes</translation> <translation id="4359717112757026264">Paisaje urbano</translation> <translation id="4361142739114356624">Falta la clave privada de este certificado de cliente o no es válida</translation> @@ -4765,7 +4770,6 @@ <translation id="5658415415603568799">Para mayor seguridad, Smart Lock te pedirá que introduzcas la contraseña después de 20 horas.</translation> <translation id="5659593005791499971">Correo</translation> <translation id="5659833766619490117">No se ha podido traducir la página</translation> -<translation id="566097169318652001">Es posible que tu dispositivo ya no funcione correctamente y que tengas problemas de seguridad y rendimiento. También es posible que las funciones clave de tus aplicaciones dejen de funcionar cuando se queden obsoletas y que pierdas el derecho a presentar demandas judiciales.</translation> <translation id="5662513737565158057">Cambia el funcionamiento de las aplicaciones de Linux.</translation> <translation id="5667293444945855280">Software malicioso</translation> <translation id="5667546120811588575">Configurando Google Play...</translation> @@ -6082,7 +6086,6 @@ <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> -<translation id="6974609594866392343">Modo Demo sin conexión</translation> <translation id="697508444536771064">Apagar Linux</translation> <translation id="6978121630131642226">Buscadores</translation> <translation id="6979044105893951891">Iniciar y salir de las sesiones de invitado gestionadas</translation> @@ -7102,6 +7105,7 @@ <translation id="7981313251711023384">Cargar páginas previamente para que la navegación y las búsquedas sean más rápidas</translation> <translation id="798145602633458219">Añadir la sugerencia <ph name="SUGGESTION_NAME" /> al cuadro de búsqueda</translation> <translation id="7981662863948574132">Mostrar ventana emergente con EID y código QR del dispositivo</translation> +<translation id="7981670705071137488">Después de que se complete este proceso, las actualizaciones de software se realizarán en segundo plano. Puedes revisar tus preferencias de actualización en Configuración.</translation> <translation id="7982083145464587921">Reinicia el dispositivo para solucionar el error.</translation> <translation id="7982789257301363584">Red</translation> <translation id="7984068253310542383">Proyectar <ph name="DISPLAY_NAME" /></translation> @@ -7346,6 +7350,7 @@ <translation id="8214489666383623925">Abrir archivo...</translation> <translation id="8215129063232901118">Accede a las funciones de tu teléfono desde tu <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Seguir bloqueando descargas automáticas de varios archivos</translation> +<translation id="822050276545350872">A partir de ahora, se acabaron las esperas</translation> <translation id="8221491193165283816">Normalmente bloqueas todas las notificaciones. Si quieres permitir que este sitio web te muestre notificaciones, haz clic aquí.</translation> <translation id="822347941086490485">Buscando dispositivos HID...</translation> <translation id="8225046344534779393">Comprueba la conexión a Internet</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 4d9bf56..1f632ef 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -876,6 +876,7 @@ <translation id="1823098433522728610">See dokument sisaldab tundlikku sisu.</translation> <translation id="18245044880483936">Varundatud andmeid ei arvestata teie lapse Drive'i salvestuskvoodi hulka.</translation> <translation id="1825565032302550710">Port peab olema vahemikus 1024 ja 65535</translation> +<translation id="182577151972096764">hiljuti vaadatud retseptid</translation> <translation id="1826192255355608658">Sünkroonige oma Chrome'i brauseri järjehoidjad, paroolid, ajalugu ja muu</translation> <translation id="1826516787628120939">Kontrollimine</translation> <translation id="1827738518074806965">Kunstigalerii</translation> @@ -1309,6 +1310,7 @@ <translation id="2241053333139545397">Andmete lugemine ja muutmine mitmel veebisaidil</translation> <translation id="2241634353105152135">Ainult ühe korra</translation> <translation id="2242687258748107519">Faili teave</translation> +<translation id="2246129643805925002">Teie seadet <ph name="DEVICE_TYPE" /> värskendatakse automaatselt taustal, et pakkuda teile uusimaid funktsioone ja turvatäiustusi. Värskendatud eelistusi saate vaadata seadetes.</translation> <translation id="2246549592927364792">Kas hankida Google'ist piltide kirjeldused?</translation> <translation id="2247738527273549923">Seda seadet haldab teie organisatsioon</translation> <translation id="2249111429176737533">Ava vahelehestatud aknas</translation> @@ -1601,6 +1603,7 @@ <translation id="249113932447298600">Kahjuks praegu seadet <ph name="DEVICE_LABEL" /> ei toetata.</translation> <translation id="2492461744635776704">Sertifikaadi allkirjastamise taotluse ettevalmistamine</translation> <translation id="2493126929778606526">Teie parimad fotod, valitud automaatselt</translation> +<translation id="2495524171012645395">Hiljuti vaadatud retseptid</translation> <translation id="2496180316473517155">Sirvimise ajalugu</translation> <translation id="2497229222757901769">Hiire kiirus</translation> <translation id="2497852260688568942">Administraator on sünkroonimise keelanud</translation> @@ -3420,6 +3423,7 @@ <translation id="4289732974614035569">Valige PIN-kood</translation> <translation id="4290791284969893584">Pärast lehe sulgemist ei pruugita alustatud toiminguid lõpule viia</translation> <translation id="4291265871880246274">Sisselogimisdialoog</translation> +<translation id="429234155571566255">need hiljuti vaadatud retseptid</translation> <translation id="4295072614469448764">Rakendus on teie terminalis saadaval. Käivitajas võib olla kuvatud ka ikoon.</translation> <translation id="4295979599050707005">Logige uuesti sisse, kinnitamaks, et teie kontot <ph name="USER_EMAIL" /> võib kasutada veebisaitide, rakenduste ja laiendustega Chrome’is ning Google Plays. Võite selle konto ka eemaldada. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Taaskäivita ja lähtesta</translation> @@ -3480,6 +3484,7 @@ <translation id="435527878592612277">Valige foto</translation> <translation id="4358302248024731679">Bluetoothi probleemide paremaks diagnoosimiseks võivad Google'i kasutajad tagasiside aruannetesse lisada täiendavad Bluetoothi logid. Kui see valik on märgitud, hõlmab teie aruanne teie praeguse seansi btsnoopi ja HCI logisid, millest on eemaldataud võimalikult palju isikut tuvastavat teavet. Nendele logidele pääsevad juurde ainult Chrome OS-i tootegrupi haldurid teenuses Listnr. Logid kustutatakse lõplikult 90 päeva pärast.</translation> <translation id="4358313196493694334">Stabiliseeri kliki asukohta</translation> +<translation id="4358643842961018282">Teie seade on ajakohane</translation> <translation id="4359408040881008151">Installitud sõltuva(te) laiendus(t)e tõttu.</translation> <translation id="4359717112757026264">Linna panoraam</translation> <translation id="4361142739114356624">Selle kliendi sertifikaadi privaatvõti puudub või on sobimatu</translation> @@ -4772,7 +4777,6 @@ <translation id="5658415415603568799">Turvalisuse suurendamiseks palub Smart Lock teil 20 tunni möödudes sisestada parooli.</translation> <translation id="5659593005791499971">E-post</translation> <translation id="5659833766619490117">Seda lehte ei õnnestunud tõlkida.</translation> -<translation id="566097169318652001">Teie seade ei pruugi enam korralikult töötada ning võite kogeda turva- ja toimivusprobleeme. Teie rakenduste olulised funktsioonid võivad aegudes samuti töö lõpetada ja te kaotate õiguse esitada juriidilisi nõudeid.</translation> <translation id="5662513737565158057">Muutke seda, kuidas Linuxi rakendused töötavad.</translation> <translation id="5667293444945855280">Pahavara</translation> <translation id="5667546120811588575">Google Play seadistamine …</translation> @@ -5626,6 +5630,7 @@ <translation id="6520876759015997832">Otsingutulemus <ph name="LIST_POSITION" />/<ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Jaotisse liikumiseks vajutage sisestusklahvi.</translation> <translation id="6521214596282732365">Saidid kasutavad tavaliselt teie fonte, et veebipõhiste kujundus- ja graafikatööriistadega kvaliteetset sisu luua</translation> <translation id="6523303810310758032">Kui kustutate oma sirvimisajaloo – kogu ajaloo või konkreetse saidi ajaloo – kustutate ka seotud mõõtmisteabe. Vaadake <ph name="BEGIN_LINK" />oma sirvimisajalugu<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Google'i paroolihalduril ei õnnestunud neid paroole teie Google'i kontole salvestada. Saate need salvestada sellesse seadmesse.</translation> <translation id="6524735478670290456">Kuidas me andmeid kasutame?</translation> <translation id="652492607360843641">Teil on ühendus võrguga <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Jaga</translation> @@ -5930,6 +5935,7 @@ <translation id="6818198425579322765">Lehel tõlgitav keel</translation> <translation id="6818547713623251698">Teie telefoni fotode, meedia, märguannete ja rakenduste vaatamine</translation> <translation id="6818802132960437751">Sisseehitatud viirusetõrje</translation> +<translation id="6818920801736417483">Kas salvestada paroolid?</translation> <translation id="6823174134746916417">Puuteplaadil klõpsamiseks puudutamine</translation> <translation id="6824564591481349393">Kopeeri &e-posti aadress</translation> <translation id="6824584962142919697">&Elementide uurimine</translation> @@ -6089,7 +6095,6 @@ <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> -<translation id="6974609594866392343">Võrguühenduseta demorežiim</translation> <translation id="697508444536771064">Lülita Linux välja</translation> <translation id="6978121630131642226">Otsingumootorid</translation> <translation id="6979044105893951891">Hallatavate külastajaseansside käivitamine ja nendest väljumine</translation> @@ -7109,6 +7114,7 @@ <translation id="7981313251711023384">Eellaaditakse lehti kiiremaks sirvimiseks ja otsimiseks</translation> <translation id="798145602633458219">Lisa otsingukasti soovitus <ph name="SUGGESTION_NAME" /></translation> <translation id="7981662863948574132">Kuva seadme EID või QR-koodiga hüpikaken</translation> +<translation id="7981670705071137488">Pärast seda toimub tarkvara värskendamine taustal. Värskendatud eelistusi saate vaadata seadetes.</translation> <translation id="7982083145464587921">Selle vea parandamiseks taaskäivitage seade.</translation> <translation id="7982789257301363584">Võrk</translation> <translation id="7984068253310542383">Peegelda kuva <ph name="DISPLAY_NAME" /></translation> @@ -7353,6 +7359,7 @@ <translation id="8214489666383623925">Ava fail...</translation> <translation id="8215129063232901118">Juurdepääs teie telefoni funktsioonidele seadmest <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Jätka mitme faili automaatse allalaadimise blokeerimist</translation> +<translation id="822050276545350872">Edaspidi pole ootamine vajalik</translation> <translation id="8221491193165283816">Tavaliselt blokeerite märguanded. Kui soovite lubada sellel saidil endale märguandeid saata, klõpsake siin.</translation> <translation id="822347941086490485">HID-seadmete leidmine …</translation> <translation id="8225046344534779393">Kontrollige internetiühendust</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 5998fa9..20ccc85 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -131,6 +131,7 @@ <translation id="1124772482545689468">Erabiltzailea</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> × <ph name="HEIGHT" /> dirudi (natiboa)</translation> <translation id="1126809382673880764">Ez zaitu babesten webgune, deskarga eta luzapen kaltegarrien aurka. Erabilgarri dagoenean, arakatze seguruaren babesa jasotzen jarraituko duzu Google-ren beste zerbitzu batzuetan (Gmail-en eta Bilaketa zerbitzuan, esaterako).</translation> +<translation id="1128090040635299943">Linux konfiguratzen ari da. Minutu batzuk beharko ditu horretarako.</translation> <translation id="1128591060186966949">Editatu bilatzailea</translation> <translation id="1129420403709586868">Ikusi telefonoko argazkiak eta multimedia-elementuak</translation> <translation id="1129850422003387628">Kudeatu aplikazioak</translation> @@ -332,6 +333,7 @@ <translation id="1327794256477341646">Kokapenerako sarbidea behar duten eginbideek ez dute funtzionatuko</translation> <translation id="1329191040029425999">Ziurtatu gailua eguneratuta dagoela eta saiatu berriro</translation> <translation id="1330145147221172764">Gaitu pantailako teklatua</translation> +<translation id="1331625853030156663"><ph name="APP_NAME" /> irekitzeko, gaitu "Inaktibo egoeratik irtetean, erakutsi pantaila blokeatua"</translation> <translation id="1331977651797684645">Ni izan naiz.</translation> <translation id="1333489022424033687">Baliteke <ph name="ORIGIN" /> webguneko eginbide batzuek ez funtzionatzea beste webgune batzuek zure gailuan gorde dituzten datuak garbitu arte</translation> <translation id="1333965224356556482">Ez eman kokapena ikusteko baimena webguneei</translation> @@ -3330,6 +3332,7 @@ <translation id="420283545744377356">Desaktibatu pantaila-babeslea</translation> <translation id="4203065553461038553">Fitxategiaren izena edo kokapena luzeegia da</translation> <translation id="4204851595694839599">Nolakoa izan da jokoaren erabilera?</translation> +<translation id="4205157409548006256">Errore bat gertatu da Linux konfiguratzean.</translation> <translation id="4206144641569145248">Estralurtarra</translation> <translation id="4206323443866416204">Iritzi-txostena</translation> <translation id="4207522141889799150">Editatu <ph name="SITE" /> webgunearen baimenak</translation> @@ -4768,7 +4771,6 @@ <translation id="5658415415603568799">Segurtasun handiagoa izateko, pasahitza idazteko eskatuko dizu Smart Lock zerbitzuak 20 ordu igarotakoan.</translation> <translation id="5659593005791499971">Helbide elektronikoa</translation> <translation id="5659833766619490117">Ezin izan da itzuli orria</translation> -<translation id="566097169318652001">Baliteke gailuak behar bezala funtzionatzeari uztea eta segurtasun- eta funtzionamendu-arazoak izatea. Halaber, litekeena da aplikazioen eginbide nagusiek funtzionatzeari uztea zaharkituta gelditzen direnean, eta zuk legezko erreklamazioak egiteko eskubidea galtzea.</translation> <translation id="5662513737565158057">Aldatu Linux-eko aplikazioen funtzionamendua.</translation> <translation id="5667293444945855280">Malwarea</translation> <translation id="5667546120811588575">Google Play konfiguratzen…</translation> @@ -5158,7 +5160,7 @@ <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />Oharra:<ph name="END_BOLD" /> baliteke zurearen antzekoa den ahots bat edo zure ahotsaren grabaketa bat erabilita <ph name="SUPERVISED_USER_NAME" /> erabiltzailearen emaitza pertsonalak atzitu ahal izatea. Bateria aurrezteko, hautatu "Hey Google" gailu hau energia-iturri batera konektatuta dagoenean soilik aktibatzeko aukera <ph name="SUPERVISED_USER_NAME" /> erabiltzailearen Laguntzailea zerbitzuaren ezarpenetan.</translation> <translation id="6064217302520318294">Pantailaren blokeoa</translation> <translation id="6065289257230303064">Ziurtagiria jasoko duen entitatearen direktorio-atributuak</translation> -<translation id="6066794465984119824">Ez dago ezarrita irudiaren hash-a</translation> +<translation id="6066794465984119824">Ez dago ezarrita irudiaren hasha</translation> <translation id="6069464830445383022">Google-ko kontuarekin hasiko duzu saioa Chromebook-en</translation> <translation id="6069671174561668781">Ezarri horma-papera</translation> <translation id="6071181508177083058">berretsi pasahitza</translation> @@ -5791,6 +5793,7 @@ <translation id="6686665106869989887">Eskuinera eraman da fitxa</translation> <translation id="6686817083349815241">Gorde zure pasahitza</translation> <translation id="6687079240787935001">Ezkutatu <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513"><ph name="ORIGIN" /> irakurri eta aldatzeko eskatzen:</translation> <translation id="6689714331348768690">Eskatu <ph name="SUPERVISED_USER_NAME" /> erabiltzaileari ordenagailura hurbiltzeko. Haurrak pantaila honetako esaldi batzuk irakurri beharko ditu bere ahots-eredua sortzeko. <ph name="BR" /> <ph name="SUPERVISED_USER_NAME" /> erabiltzaileak irakurtzen ez badaki, eska iezaiozu zuk esandakoa errepika dezala. Xuxurla iezaiozu zer esan behar duen mikrofonotik urrun, Laguntzailea zerbitzuak haurraren ahotsa ikas dezan, eta ez zurea.</translation> @@ -6084,7 +6087,6 @@ <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> -<translation id="6974609594866392343">Konexiorik gabeko demo modua</translation> <translation id="697508444536771064">Itxi Linux</translation> <translation id="6978121630131642226">Bilatzaileak</translation> <translation id="6979044105893951891">Abiarazi eta amaitu gonbidatuentzako saio kudeatuak</translation> @@ -6303,6 +6305,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Irten orritik}other{Irten orrietatik}}</translation> <translation id="7207457272187520234">Bidali erabilera- eta diagnostiko-datuak. Gailu honek automatikoki bidaltzen dizkio Google-ri diagnostikoak eta gailu zein aplikazioen erabilera-datuak. Horri esker, sistemaren eta aplikazioen egonkortasuna hobetuko da, besteak beste. Gainera, multzokatutako datu batzuk oso baliagarriak izango dira Google-ren aplikazioak hobetzeko eta bazkideei laguntzeko (adibidez, Android-en garatzaileei). Jabeak konfiguratu du ezarpen hori. Sareko eta aplikazioetako jarduera gehigarriak ezarpena aktibatuta badago, baliteke datu horiek Google-ko kontuan gordetzea.</translation> <translation id="7207631048330366454">Bilatu aplikazioak</translation> +<translation id="720808544705441386">Ezin da ireki aplikazioa</translation> <translation id="7210499381659830293">Luzapen bidezko inprimagailuak</translation> <translation id="7211783048245131419">Oraindik ez da esleitu erabilerraztasun-etengailurik</translation> <translation id="7212097698621322584">PINa aldatzeko, idatzi unekoa lehendabizi. Ez badakizu PINa zein den, segurtasun-giltza berrezarri beharko duzu, eta beste PIN bat sortu.</translation> @@ -7458,6 +7461,7 @@ <translation id="8324784016256120271">Webguneek cookieak erabil ditzakete beste webguneetan egiten dituzun arakatze-jarduerak ikusteko, hala nola iragarkiak pertsonalizatzeko.</translation> <translation id="8325413836429495820">Ezin dute ikusi arbela</translation> <translation id="8326478304147373412">PKCS #7, ziurtagiri-katea</translation> +<translation id="8327386430364625757">Letra matematikoa</translation> <translation id="8327676037044516220">Baimenak eta edukiaren ezarpenak</translation> <translation id="8330617762701840933">Ordezko arakatzailera birbideratzen duten webguneen zerrenda.</translation> <translation id="8330689128072902965">Inguruan dituzun kontaktuek edukia parteka dezakete zurekin. Sakatu hau aldatzeko.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index bfb319f..da8aec15 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -4784,7 +4784,6 @@ <translation id="5658415415603568799">برای امنیت بیشتر، Smart Lock درخواست میکند گذرواژهتان را بعد از ۲۰ ساعت وارد کنید.</translation> <translation id="5659593005791499971">ایمیل</translation> <translation id="5659833766619490117">ترجمه این صفحه امکانپذیر نیست</translation> -<translation id="566097169318652001">ممکن است دستگاهتان دیگر بهدرستی کار نکند، و ممکن است با مشکلات کاربردی و امنیتی مواجه شوید. ممکن است ویژگیهای کلیدی در برنامههایتان وقتی از رده خارج شوند دیگر کار نکنند و شما حق مطرح کردن دعوی حقوقی را ازدست خواهید داد.</translation> <translation id="5662513737565158057">نحوه کارکرد برنامههای Linux را تغییر دهید.</translation> <translation id="5667293444945855280">بدافزار</translation> <translation id="5667546120811588575">درحال راهاندازی Google Play...</translation> @@ -5638,6 +5637,7 @@ <translation id="6520876759015997832">نتیجه جستجوی <ph name="LIST_POSITION" /> از <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" /> برای پیمایش کردن به بخش، Enter را فشار دهید.</translation> <translation id="6521214596282732365">سایتها معمولاً از قلمهایتان استفاده میکنند تا با ابزارهای گرافیکی و طراحی آنلاین بتوانید محتوای با شباهت زیاد به اصل ایجاد کنید</translation> <translation id="6523303810310758032">وقتی سابقه مرور (همه سوابق یا سابقه سایتی بهخصوص) را حذف میکنید، در واقع اطلاعات سنجش مرتبط را هم حذف میکنید. <ph name="BEGIN_LINK" />سابقه مرورتان<ph name="END_LINK" /> را ببینید</translation> +<translation id="6523574494641144162">«مدیر گذرواژه Google» نتوانست این گذرواژهها را در «حساب Google» شما ذخیره کند. میتوانید آنها را در این دستگاه ذخیره کنید.</translation> <translation id="6524735478670290456">نحوه استفاده ما از این دادهها:</translation> <translation id="652492607360843641">به یک شبکه <ph name="NETWORK_TYPE" /> متصل شدهاید.</translation> <translation id="6527303717912515753">اشتراکگذاری</translation> @@ -5944,6 +5944,7 @@ <translation id="6818198425579322765">زبان صفحه موردنظر برای ترجمه</translation> <translation id="6818547713623251698">مشاهده عکسها، رسانه، اعلانها، و برنامههای تلفن</translation> <translation id="6818802132960437751">مجهز به محافظ دربرابر ویروس</translation> +<translation id="6818920801736417483">گذرواژهها ذخیره شود؟</translation> <translation id="6823174134746916417">کلیک با یک ضربه روی صفحه لمسی</translation> <translation id="6824564591481349393">کپی آدرس &ایمیل</translation> <translation id="6824584962142919697">&بازرسی عناصر</translation> @@ -6103,7 +6104,6 @@ <translation id="697312151395002334">اجازه دارد بالاپر ارسال کند و از هدایتها استفاده کند</translation> <translation id="6973611239564315524">ارتقا به Debian 10 (Buster) در دسترس است</translation> <translation id="69739764870135975">اگر موتور جستجوی پیشفرضتان هم Google باشد، پیشنهادهای بهتر و مرتبطتری درباره موضوع خواهید دید</translation> -<translation id="6974609594866392343">حالت نمایشی آفلاین</translation> <translation id="697508444536771064">خاموش کردن Linux</translation> <translation id="6978121630131642226">موتورهای جستجو</translation> <translation id="6979044105893951891">راهاندازی و خروج از جلسههای مهمان مدیریتشده</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 688f224..b63dc0981 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -4783,7 +4783,6 @@ <translation id="5658415415603568799">Turvallisuussyistä Smart Lock pyytää antamaan salasanan, kun 20 tuntia on kulunut.</translation> <translation id="5659593005791499971">Sähköposti</translation> <translation id="5659833766619490117">Sivua ei voi kääntää</translation> -<translation id="566097169318652001">Laite ei välttämättä toimi kunnolla, ja saatat kokea turvallisuuteen ja suorituskykyyn liittyviä ongelmia. Sovellusten tärkeimmät ominaisuudet saattavat myös lakata toimimasta, kun ne vanhenevat, etkä voi enää tehdä oikeudellisia vaatimuksia.</translation> <translation id="5662513737565158057">Muuta Linux-sovellusten toimintatapaa.</translation> <translation id="5667293444945855280">Haittaohjelma</translation> <translation id="5667546120811588575">Määritetään Google Playta…</translation> @@ -5000,7 +4999,7 @@ <translation id="5895138241574237353">Käynnistä uudelleen</translation> <translation id="5895335062901455404">Tallentamasi asetukset ja toiminta ovat valmiina millä tahansa ChromeOS Flex ‑laitteella, kun kirjaudut sisään Google-tilillesi. Voit valita synkronoitavan sisällön asetuksissa.</translation> <translation id="5896436821193322561">Älä salli</translation> -<translation id="5900186025777217044">Smart Lock on muuttunut</translation> +<translation id="5900186025777217044">Muutoksia Smart Lockissa</translation> <translation id="5900302528761731119">Google-profiilin kuva</translation> <translation id="590036993063074298">Peilauksen laatutiedot</translation> <translation id="5901069264981746702">Sormenjälkidata tallennetaan turvallisesti vain laitteellesi (<ph name="DEVICE_TYPE" />). <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> @@ -5637,6 +5636,7 @@ <translation id="6520876759015997832">Hakutulos <ph name="LIST_POSITION" />/<ph name="LIST_SIZE" />. <ph name="SEARCH_RESULT_TEXT" />. Siirry osioon painamalla Enter.</translation> <translation id="6521214596282732365">Sivustot käyttävät yleensä fonttejasi, joten voit luoda tasokasta sisältöä verkossa olevilla suunnittelu- ja grafiikkatyökaluilla</translation> <translation id="6523303810310758032">Kun poistat selaushistoriaa (koko historian tai vain tietyn sivuston osalta), poistat myös siihen liittyvät mittaustiedot. Tarkista <ph name="BEGIN_LINK" />selaushistoriasi<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Google Salasanat ei voinut tallentaa näitä salasanoja Google-tilillesi. Voit tallentaa ne tälle laitteelle.</translation> <translation id="6524735478670290456">Miten käytämme tätä dataa:</translation> <translation id="652492607360843641">Olet yhteydessä verkkoon (<ph name="NETWORK_TYPE" />).</translation> <translation id="6527303717912515753">Jaa</translation> @@ -5941,6 +5941,7 @@ <translation id="6818198425579322765">Käännettävän sivun kieli</translation> <translation id="6818547713623251698">Katsele puhelimesi kuvia, mediaa, ilmoituksia ja sovelluksia</translation> <translation id="6818802132960437751">Sisäänrakennettu virustorjunta</translation> +<translation id="6818920801736417483">Tallennetaanko salasanat?</translation> <translation id="6823174134746916417">Kosketuslevyn napauttamalla klikkaus</translation> <translation id="6824564591481349393">Kopioi sähköpostiosoit&e</translation> <translation id="6824584962142919697">Tutk&i elementtejä</translation> @@ -6100,7 +6101,6 @@ <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> -<translation id="6974609594866392343">Offline-esittelytila</translation> <translation id="697508444536771064">Sammuta Linux</translation> <translation id="6978121630131642226">Hakukoneet</translation> <translation id="6979044105893951891">käynnistää ylläpidettyjä Vierailija-käyttökertoja ja poistua niistä</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 7a325636..9c72547 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">User</translation> <translation id="1125550662859510761">Mukhang <ph name="WIDTH" /> x <ph name="HEIGHT" /> (Native)</translation> <translation id="1126809382673880764">Hindi ka pinoprotektahan laban sa mga mapanganib na website, download, at extension. Magkakaroon ka pa rin ng proteksyon ng Ligtas na Pag-browse, kung available, sa iba pang serbisyo ng Google, tulad ng Gmail at Search.</translation> +<translation id="1128090040635299943">Kasalukuyang kino-configure ang Linux. Tatagal nang ilang minuto ang pag-configure.</translation> <translation id="1128591060186966949">I-edit ang search engine</translation> <translation id="1129420403709586868">Tingnan ang mga larawan at media ng iyong telepono</translation> <translation id="1129850422003387628">Pamahalaan ang mga app</translation> @@ -335,6 +336,7 @@ <translation id="1327794256477341646">Hindi gagana ang mga feature na nangangailangan ng iyong lokasyon</translation> <translation id="1329191040029425999">Tiyaking up to date ang iyong device at pakisubukan ulit</translation> <translation id="1330145147221172764">I-enable ang on-screen na keyboard</translation> +<translation id="1331625853030156663">Para buksan ang <ph name="APP_NAME" />, i-enable ang "Ipakita ang lock screen kapag pinagana mula sa sleep"</translation> <translation id="1331977651797684645">Ako ito.</translation> <translation id="1333489022424033687">Posibleng hindi gumana ang ilang feature sa <ph name="ORIGIN" /> hanggang sa i-clear mo ang data na na-store ng iba pang site sa iyong device</translation> <translation id="1333965224356556482">Huwag payagan ang mga site na makita ang iyong lokasyon</translation> @@ -3347,6 +3349,7 @@ <translation id="420283545744377356">I-off ang screen saver</translation> <translation id="4203065553461038553">Masyadong mahaba ang pangalan o lokasyon ng file</translation> <translation id="4204851595694839599">Kumusta ang karanasan mo sa gameplay?</translation> +<translation id="4205157409548006256">Nagka-error habang kino-configure ang Linux.</translation> <translation id="4206144641569145248">Alien</translation> <translation id="4206323443866416204">Ulat ng Feedback</translation> <translation id="4207522141889799150">I-edit ang mga pahintulot sa site para sa <ph name="SITE" /></translation> @@ -4788,7 +4791,6 @@ <translation id="5658415415603568799">Para sa karagdagang seguridad, hihilingin sa iyo ng Smart Lock na ilagay ang iyong password pagkatapos ng 20 oras.</translation> <translation id="5659593005791499971">Email</translation> <translation id="5659833766619490117">Hindi maisalin ang page na ito</translation> -<translation id="566097169318652001">Posibleng hindi na gumana nang maayos ang iyong device, at posibleng makaranas ka ng mga isyu sa seguridad at performance. Posible ring tumigil sa paggana ang mga pangunahing feature sa iyong mga app kapag luma na ang mga ito, at mawawala ang karapatan mong gumawa ng mga legal na claim.</translation> <translation id="5662513737565158057">Baguhin kung paano gagana ang mga Linux app.</translation> <translation id="5667293444945855280">Malware</translation> <translation id="5667546120811588575">Sine-set up ang Google Play...</translation> @@ -5814,6 +5816,7 @@ <translation id="6686665106869989887">Inilipat sa kanan ang tab</translation> <translation id="6686817083349815241">I-save ang iyong password</translation> <translation id="6687079240787935001">Itago ang <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">Hinihiling na i-read at baguhin ang <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">Hilingin kay <ph name="SUPERVISED_USER_NAME" /> na lumapit sa computer. Magbabasa ang iyong anak ng ilang parirala sa screen na ito para gawin ang kanyang voice model. <ph name="BR" /> Kung kailangan ni <ph name="SUPERVISED_USER_NAME" /> ng tulong sa pagbabasa, utusan ang iyong anak na gayahin ang sasabihin mo. Bumulong nang malayo sa mikropono para boses ng iyong anak sa halip na boses mo ang matutunan ng Assistant.</translation> @@ -6107,7 +6110,6 @@ <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> -<translation id="6974609594866392343">Offline na demo mode</translation> <translation id="697508444536771064">I-shut down ang Linux</translation> <translation id="6978121630131642226">Mga Search Engine</translation> <translation id="6979044105893951891">Ilunsad ang at lumabas sa mga pinapamahalaang session ng bisita</translation> @@ -6326,6 +6328,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Umalis sa Page}one{Umalis sa Mga Page}other{Umalis sa Mga Page}}</translation> <translation id="7207457272187520234">Magpadala ng data ng paggamit at diagnostic. Sa kasalukuyan, ang device na ito ay awtomatikong nagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Ipinapatupad ng may-ari ang setting na ito. Kung naka-on ang iyong karagdagang setting ng Aktibidad sa Web at App, posibleng ma-save ang data na ito sa Google Account mo.</translation> <translation id="7207631048330366454">Maghanap ng mga app</translation> +<translation id="720808544705441386">Hindi mabuksan ang app</translation> <translation id="7210499381659830293">Mga extension na printer</translation> <translation id="7211783048245131419">Wala pang switch na naitalaga</translation> <translation id="7212097698621322584">Ilagay ang kasalukuyan mong PIN para palitan ito. Kung hindi mo alam ang iyong PIN, kakailanganin mong i-reset ang security key, pagkatapos ay gumawa ng bagong PIN.</translation> @@ -7483,6 +7486,7 @@ <translation id="8324784016256120271">Puwedeng gumamit ng cookies ang mga site para makita ang iyong aktibidad sa pag-browse sa iba't ibang site, halimbawa, para mag-personalize ng mga ad</translation> <translation id="8325413836429495820">Hindi pinapayagang tingnan ang iyong clipboard</translation> <translation id="8326478304147373412">PKCS #7, certificate chain</translation> +<translation id="8327386430364625757">Mathematical na font</translation> <translation id="8327676037044516220">Mga pahintulot at setting ng content</translation> <translation id="8330617762701840933">Ang listahan ng mga website na nagre-redirect sa alternatibong browser.</translation> <translation id="8330689128072902965">Makakapagbahagi sa iyo ang mga kalapit na contact. I-click para baguhin.</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index b62aa2a..f235273 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -874,6 +874,7 @@ <translation id="1823098433522728610">Le contenu de ce document est confidentiel.</translation> <translation id="18245044880483936">Les données des sauvegardes ne sont pas prises en compte dans le quota de stockage Google Disque de votre enfant.</translation> <translation id="1825565032302550710">Le numéro de port doit se trouver entre 1 024 et 65 535</translation> +<translation id="182577151972096764">recettes récemment consultées</translation> <translation id="1826192255355608658">Synchroniser votre navigateur Chrome, vos favoris, vos mots de passe, votre historique et plus</translation> <translation id="1826516787628120939">Vérification en cours…</translation> <translation id="1827738518074806965">Galerie d'art</translation> @@ -1307,6 +1308,7 @@ <translation id="2241053333139545397">Accéder à vos données sur un certain nombre de sites Web et les modifier</translation> <translation id="2241634353105152135">Une fois</translation> <translation id="2242687258748107519">Information sur le fichier</translation> +<translation id="2246129643805925002">Votre <ph name="DEVICE_TYPE" /> se met automatiquement à jour en arrière-plan pour vous offrir les dernières fonctionnalités et améliorations de sécurité. Vous pouvez examiner vos préférences de mise à jour dans les paramètres.</translation> <translation id="2246549592927364792">Télécharger les descriptions d'image de Google?</translation> <translation id="2247738527273549923">Votre appareil est géré par votre organisation</translation> <translation id="2249111429176737533">Ouvrir en tant que fenêtre à onglets</translation> @@ -1596,6 +1598,7 @@ <translation id="249113932447298600">Désolés, le périphérique <ph name="DEVICE_LABEL" /> n'est pas compatible pour le moment.</translation> <translation id="2492461744635776704">Préparation de la requête de signature de certificat</translation> <translation id="2493126929778606526">Vos meilleures photos, sélectionnées automatiquement</translation> +<translation id="2495524171012645395">Recettes récemment consultées</translation> <translation id="2496180316473517155">Historique de navigation</translation> <translation id="2497229222757901769">Vitesse de la souris</translation> <translation id="2497852260688568942">La synchronisation est désactivée par votre administrateur</translation> @@ -3416,6 +3419,7 @@ <translation id="4289732974614035569">Choisir un NIP</translation> <translation id="4290791284969893584">Si vous fermez une page, les tâches lancées risquent de ne pas être terminées</translation> <translation id="4291265871880246274">Boîte de dialogue de connexion</translation> +<translation id="429234155571566255">ces recettes récemment consultées</translation> <translation id="4295072614469448764">L'application est disponible dans votre terminal. Une icône peut également être disponible dans votre lanceur d'applications.</translation> <translation id="4295979599050707005">Veuillez vous connecter à nouveau pour confirmer que votre compte <ph name="USER_EMAIL" /> peut être utilisé avec des sites Web, des applications et des extensions dans Chrome et dans Google Play. Vous pouvez aussi supprimer ce compte. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Redémarrer et réinitialiser</translation> @@ -3476,6 +3480,7 @@ <translation id="435527878592612277">Sélectionner votre photo</translation> <translation id="4358302248024731679">Pour obtenir un meilleur diagnostic des problèmes liés au Bluetooth, les employés de Google peuvent inclure des journaux Bluetooth supplémentaires dans leurs rapports de commentaires. Lorsque cette option est cochée, votre rapport inclut les journaux btsnoop et HCI de votre session en cours, qui sont anonymisés de façon à retirer autant de données personnelles que possible. L'accès à ces journaux est réservé aux gestionnaires du groupe de produits Chrome OS dans Listnr. Les journaux seront supprimés définitivement au bout de 90 jours.</translation> <translation id="4358313196493694334">Stabiliser la position du curseur</translation> +<translation id="4358643842961018282">Votre appareil est à jour</translation> <translation id="4359408040881008151">Cette extension a été installée en raison d'une dépendance avec une ou plusieurs autres extensions.</translation> <translation id="4359717112757026264">Paysage urbain</translation> <translation id="4361142739114356624">La clé privée de ce certificat de client est manquante ou non valide</translation> @@ -4768,7 +4773,6 @@ <translation id="5658415415603568799">Pour une sécurité accrue, Smart Lock vous demandera d'entrer votre mot de passe après 20 heures.</translation> <translation id="5659593005791499971">Courriel</translation> <translation id="5659833766619490117">Impossible de traduire cette page</translation> -<translation id="566097169318652001">Votre appareil pourrait ne plus fonctionner correctement, et vous pourriez rencontrer des problèmes de sécurité et de performance. Des fonctionnalités clés de vos applications peuvent également cesser de fonctionner lorsqu'elles deviennent obsolètes, et vous perdrez votre droit de faire des réclamations légales.</translation> <translation id="5662513737565158057">Modifiez la manière dont les applications Linux vont fonctionner.</translation> <translation id="5667293444945855280">Logiciels malveillants</translation> <translation id="5667546120811588575">Configuration de Google Play en cours…</translation> @@ -6087,7 +6091,6 @@ <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> -<translation id="6974609594866392343">Mode Démo hors connexion</translation> <translation id="697508444536771064">Éteindre Linux</translation> <translation id="6978121630131642226">Moteurs de recherche</translation> <translation id="6979044105893951891">Lancer et quitter les sessions d'invité gérées</translation> @@ -7107,6 +7110,7 @@ <translation id="7981313251711023384">Précharger les pages pour une navigation et une recherche plus rapides</translation> <translation id="798145602633458219">Ajouter la suggestion <ph name="SUGGESTION_NAME" /> au champ de recherche</translation> <translation id="7981662863948574132">Afficher la fenêtre contextuelle du numéro EID et du code QR de l'appareil</translation> +<translation id="7981670705071137488">Dorénavant, les mises à jour logicielles se feront en arrière-plan. Vous pouvez examiner vos préférences de mise à jour dans les paramètres.</translation> <translation id="7982083145464587921">Veuillez redémarrer votre appareil pour corriger cette erreur.</translation> <translation id="7982789257301363584">Réseau</translation> <translation id="7984068253310542383">Dupliquer l'écran de <ph name="DISPLAY_NAME" /></translation> @@ -7350,6 +7354,7 @@ <translation id="8214489666383623925">Ouvrir...</translation> <translation id="8215129063232901118">Accéder aux fonctionnalités de votre téléphone à partir de votre <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Continuer à bloquer le téléchargement automatique de plusieurs fichiers</translation> +<translation id="822050276545350872">L'attente est désormais chose du passé</translation> <translation id="8221491193165283816">Vous bloquez habituellement les notifications. Pour autoriser ce site à vous envoyer des notifications, cliquez ici.</translation> <translation id="822347941086490485">Recherche d'appareils HID en cours…</translation> <translation id="8225046344534779393">Vérifiez la connexion Internet</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index c9a19ee..52d795f 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -874,6 +874,7 @@ <translation id="1823098433522728610">Le contenu de ce document est sensible.</translation> <translation id="18245044880483936">Les données sauvegardées ne sont pas comptabilisées dans le quota de stockage Drive de votre enfant.</translation> <translation id="1825565032302550710">Vous devez saisir un numéro de port compris entre 1024 et 65535</translation> +<translation id="182577151972096764">recettes consultées récemment</translation> <translation id="1826192255355608658">Synchroniser entre autres les favoris, les mots de passe et l'historique de votre navigateur Chrome</translation> <translation id="1826516787628120939">Vérification en cours…</translation> <translation id="1827738518074806965">Galerie d'art</translation> @@ -1307,6 +1308,7 @@ <translation id="2241053333139545397">Accéder aux données de plusieurs sites et les modifier</translation> <translation id="2241634353105152135">Une seule fois</translation> <translation id="2242687258748107519">Informations sur le fichier</translation> +<translation id="2246129643805925002">Votre <ph name="DEVICE_TYPE" /> se met à jour automatiquement en arrière-plan pour vous permettre de bénéficier des dernières fonctionnalités et améliorations de sécurité. Vous pouvez consulter vos préférences de mise à jour dans les paramètres.</translation> <translation id="2246549592927364792">Obtenir des descriptions d'images de Google ?</translation> <translation id="2247738527273549923">Cet appareil est géré par votre organisation</translation> <translation id="2249111429176737533">Ouvrir dans une fenêtre à onglets</translation> @@ -1596,6 +1598,7 @@ <translation id="249113932447298600">Désolé, le périphérique <ph name="DEVICE_LABEL" /> n'est pas compatible pour le moment.</translation> <translation id="2492461744635776704">Préparation de la demande de signature du certificat</translation> <translation id="2493126929778606526">Vos plus belles photos sélectionnées automatiquement</translation> +<translation id="2495524171012645395">Recettes consultées récemment</translation> <translation id="2496180316473517155">Historique de navigation</translation> <translation id="2497229222757901769">Vitesse de la souris</translation> <translation id="2497852260688568942">Votre administrateur a désactivé la synchronisation</translation> @@ -3415,6 +3418,7 @@ <translation id="4289732974614035569">Sélectionner un code</translation> <translation id="4290791284969893584">Si vous fermez une page, les tâches lancées risquent de ne pas être terminées</translation> <translation id="4291265871880246274">Boîte de dialogue de connexion</translation> +<translation id="429234155571566255">ces recettes consultées récemment</translation> <translation id="4295072614469448764">L'application est disponible via votre terminal. Il peut également y avoir une icône dans votre lanceur d'applications.</translation> <translation id="4295979599050707005">Veuillez vous reconnecter pour confirmer que votre compte <ph name="USER_EMAIL" /> peut être utilisé avec des sites Web, des applications et des extensions dans Chrome et Google Play. Vous pouvez également supprimer ce compte. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Redémarrer et réinitialiser</translation> @@ -3475,6 +3479,7 @@ <translation id="435527878592612277">Sélectionner votre photo</translation> <translation id="4358302248024731679">Afin de mieux analyser les problèmes liés au Bluetooth, les Googleurs peuvent fournir des journaux Bluetooth supplémentaires en plus de leurs rapports de commentaires. Lorsque cette option est cochée, le rapport contient les journaux btsnoop et HCI de la session en cours, qui ont été nettoyés pour retirer le maximum d'informations personnelles. Seuls les responsables du groupe de produits Chrome OS ont accès aux journaux dans Listnr. Ceux-ci sont définitivement supprimés au bout de 90 jours.</translation> <translation id="4358313196493694334">Stabiliser la position du curseur</translation> +<translation id="4358643842961018282">Votre appareil est à jour</translation> <translation id="4359408040881008151">Installée, car une ou plusieurs extensions dépendent de celle-ci.</translation> <translation id="4359717112757026264">Paysage urbain</translation> <translation id="4361142739114356624">La clé privée de ce certificat client est manquante ou incorrecte</translation> @@ -4768,7 +4773,6 @@ <translation id="5658415415603568799">Pour plus de sécurité, Smart Lock vous invitera à saisir votre mot de passe 20 heures après.</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5659833766619490117">Impossible de traduire cette page</translation> -<translation id="566097169318652001">Votre appareil risque de ne plus fonctionner correctement, et vous pouvez rencontrer des problèmes de sécurité et de performances. Les fonctionnalités clés de vos applis peuvent aussi cesser de fonctionner quand elles deviennent obsolètes, et vous perdrez le droit de déposer des réclamations légales.</translation> <translation id="5662513737565158057">Modifier le fonctionnement des applications Linux.</translation> <translation id="5667293444945855280">Logiciels malveillants</translation> <translation id="5667546120811588575">Configuration de Google Play…</translation> @@ -5622,6 +5626,7 @@ <translation id="6520876759015997832">Résultat de recherche <ph name="LIST_POSITION" /> sur <ph name="LIST_SIZE" /> : <ph name="SEARCH_RESULT_TEXT" />. Appuyez sur Entrée pour accéder à la section.</translation> <translation id="6521214596282732365">Les sites utilisent généralement vos polices pour que vous puissiez créer du contenu haute fidélité grâce à des outils de conception et de graphisme en ligne</translation> <translation id="6523303810310758032">Lorsque vous supprimez votre historique de navigation (entièrement ou pour un site spécifique), vous supprimez aussi les informations de mesure associées. Consultez votre <ph name="BEGIN_LINK" />historique de navigation<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Le Gestionnaire de mots de passe de Google n'a pas pu enregistrer ces mots de passe dans votre compte Google. Vous pouvez les enregistrer sur cet appareil.</translation> <translation id="6524735478670290456">Comment nous utilisons ces données :</translation> <translation id="652492607360843641">Vous êtes connecté à un réseau <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Partager</translation> @@ -5928,6 +5933,7 @@ <translation id="6818198425579322765">Langue source</translation> <translation id="6818547713623251698">Afficher les photos, contenus multimédias, notifications et applis de votre téléphone</translation> <translation id="6818802132960437751">Protection antivirus intégrée</translation> +<translation id="6818920801736417483">Enregistrer les mots de passe ?</translation> <translation id="6823174134746916417">Fonctionnalité Taper pour cliquer du pavé tactile</translation> <translation id="6824564591481349393">Copi&er l'adresse e-mail</translation> <translation id="6824584962142919697">&Examiner les éléments</translation> @@ -6087,7 +6093,6 @@ <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> -<translation id="6974609594866392343">Mode de démonstration hors connexion</translation> <translation id="697508444536771064">Arrêter Linux</translation> <translation id="6978121630131642226">Moteurs de recherche</translation> <translation id="6979044105893951891">Lancer et quitter les sessions Invité gérées</translation> @@ -7107,6 +7112,7 @@ <translation id="7981313251711023384">Précharger les pages pour accélérer la navigation et la recherche</translation> <translation id="798145602633458219">Ajouter la suggestion <ph name="SUGGESTION_NAME" /> au champ de recherche</translation> <translation id="7981662863948574132">Afficher le pop-up contenant le code QR et l'EID de l'appareil</translation> +<translation id="7981670705071137488">Les mises à jour logicielles seront effectuées en tâches de fond. Vous pouvez consulter vos préférences de mise à jour dans les paramètres.</translation> <translation id="7982083145464587921">Pour corriger cette erreur, veuillez redémarrer votre appareil.</translation> <translation id="7982789257301363584">Réseau</translation> <translation id="7984068253310542383">Dupliquer l'écran <ph name="DISPLAY_NAME" /></translation> @@ -7351,6 +7357,7 @@ <translation id="8214489666383623925">Ouvrir le fichier...</translation> <translation id="8215129063232901118">Accédez aux fonctionnalités de votre téléphone depuis votre <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Continuer à bloquer le téléchargement automatique de plusieurs fichiers</translation> +<translation id="822050276545350872">À partir de maintenant, plus besoin d'attendre</translation> <translation id="8221491193165283816">Les notifications sont bloquées par défaut. Pour autoriser ce site à vous envoyer des notifications, cliquez ici.</translation> <translation id="822347941086490485">Recherche d'périphériques HID…</translation> <translation id="8225046344534779393">Vérifiez votre connexion Internet</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 5fd0651..f3f131e5 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -872,6 +872,7 @@ <translation id="1823098433522728610">Este documento ten contido confidencial.</translation> <translation id="18245044880483936">Os datos da copia de seguranza non contarán na cota de almacenamento de Drive do teu fillo.</translation> <translation id="1825565032302550710">O porto debe estar comprendido entre o 1024 e o 65535</translation> +<translation id="182577151972096764">receitas vistas recentemente</translation> <translation id="1826192255355608658">Sincroniza os marcadores, os contrasinais, o historial e máis datos do navegador Chrome</translation> <translation id="1826516787628120939">Comprobando</translation> <translation id="1827738518074806965">Galería de arte</translation> @@ -1118,7 +1119,7 @@ <translation id="2078019350989722914">Avisar antes de pechar (<ph name="KEY_EQUIVALENT" />)</translation> <translation id="2079053412993822885">Se eliminas un dos teus propios certificados, non poderás volver utilizalo para identificarte.</translation> <translation id="2079545284768500474">Desfacer</translation> -<translation id="2080070583977670716">Máis configuracións</translation> +<translation id="2080070583977670716">Máis opcións de configuración</translation> <translation id="2081816110395725788">Activar modo de suspensión mentres se use a batería</translation> <translation id="2082187087049518845">Agrupar pestana</translation> <translation id="2082510809738716738">Escolle unha cor para o tema</translation> @@ -1305,6 +1306,7 @@ <translation id="2241053333139545397">Ler e cambiar os teus datos en varios sitios web</translation> <translation id="2241634353105152135">Só unha vez</translation> <translation id="2242687258748107519">Información do ficheiro</translation> +<translation id="2246129643805925002">O teu dispositivo (<ph name="DEVICE_TYPE" />) actualízase automaticamente en segundo plano para ofrecerche as últimas funcións e melloras de seguranza. Podes revisar as túas preferencias de actualización en Configuración.</translation> <translation id="2246549592927364792">Queres obter descricións de Google para as imaxes?</translation> <translation id="2247738527273549923">A túa organización xestiona o teu dispositivo</translation> <translation id="2249111429176737533">Abrir como ventá con pestanas</translation> @@ -1594,6 +1596,7 @@ <translation id="249113932447298600">O dispositivo <ph name="DEVICE_LABEL" /> non é compatible neste momento.</translation> <translation id="2492461744635776704">Preparando solicitude de sinatura do certificado</translation> <translation id="2493126929778606526">As túas mellores fotos, seleccionadas automaticamente</translation> +<translation id="2495524171012645395">Receitas vistas recentemente</translation> <translation id="2496180316473517155">Historial de navegación</translation> <translation id="2497229222757901769">Velocidade do rato</translation> <translation id="2497852260688568942">O administrador desactivou a sincronización</translation> @@ -3412,6 +3415,7 @@ <translation id="4289732974614035569">Escolle un PIN</translation> <translation id="4290791284969893584">Ao pechar unha páxina, as tarefas iniciadas poderían non finalizar</translation> <translation id="4291265871880246274">Cadro de diálogo de inicio de sesión</translation> +<translation id="429234155571566255">estas receitas vistas recentemente</translation> <translation id="4295072614469448764">A aplicación está dispoñible no terminal. Tamén pode haber unha icona no menú de aplicacións.</translation> <translation id="4295979599050707005">Volve iniciar sesión para confirmar que se pode utilizar a túa conta <ph name="USER_EMAIL" /> cos sitios web, aplicacións e extensións en Chrome e Google Play. Tamén podes quitar esta conta. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Reiniciar e restablecer</translation> @@ -3472,6 +3476,7 @@ <translation id="435527878592612277">Seleccionar a túa foto</translation> <translation id="4358302248024731679">Para mellorar o diagnóstico dos problemas de Bluetooth, os Googlers poden incluír rexistros de Bluetooth adicionais cos seus informes de comentarios. Cando se seleccione esta opción, o informe incluirá rexistros de btsnoop e HCI da túa sesión actual, modificados para quitar o máximo de información que permita a identificación persoal. Limitarase o acceso a estes rexistros aos xestores do grupo de produtos de Chrome OS en Listnr. Os rexistros eliminaranse despois de 90 días.</translation> <translation id="4358313196493694334">Estabiliza a localización dos clics</translation> +<translation id="4358643842961018282">O dispositivo está actualizado</translation> <translation id="4359408040881008151">Instalada debido ás extensións dependentes.</translation> <translation id="4359717112757026264">Paisaxe urbana</translation> <translation id="4361142739114356624">Falta a clave privada para este certificado de cliente ou non é válida</translation> @@ -4762,7 +4767,6 @@ <translation id="5658415415603568799">Para obter unha maior seguranza, Smart Lock pedirache que introduzas o contrasinal despois de 20 horas.</translation> <translation id="5659593005791499971">Correo electrónico</translation> <translation id="5659833766619490117">Non se puido traducir esta páxina</translation> -<translation id="566097169318652001">É posible que o dispositivo deixe de funcionar adecuadamente e que teñas problemas de seguranza e de rendemento. Tamén pode que as funcións principais das aplicacións deixen de estar dispoñibles cando estas queden obsoletas e que perdas o dereito de facer reclamacións legais.</translation> <translation id="5662513737565158057">Cambia o funcionamento das aplicacións de Linux.</translation> <translation id="5667293444945855280">Software malicioso</translation> <translation id="5667546120811588575">Configurando Google Play...</translation> @@ -6078,7 +6082,6 @@ <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> -<translation id="6974609594866392343">Modo de demostración sen conexión</translation> <translation id="697508444536771064">Pechar Linux</translation> <translation id="6978121630131642226">Motores de busca</translation> <translation id="6979044105893951891">Iniciar e pechar sesións de invitado xestionadas</translation> @@ -7097,6 +7100,7 @@ <translation id="7981313251711023384">Cargar previamente as páxinas para que a navegación e as buscas sexan máis rápidas</translation> <translation id="798145602633458219">Anexar a suxestión "<ph name="SUGGESTION_NAME" />" á caixa de busca</translation> <translation id="7981662863948574132">Mostrar ventá emerxente co EID do dispositivo e co código QR correspondente</translation> +<translation id="7981670705071137488">Unha vez que remate este proceso, o software actualizarase en segundo plano. Podes revisar as túas preferencias de actualización en Configuración.</translation> <translation id="7982083145464587921">Reinicia o dispositivo para corrixir este erro.</translation> <translation id="7982789257301363584">Rede</translation> <translation id="7984068253310542383">Proxectar <ph name="DISPLAY_NAME" /></translation> @@ -7340,6 +7344,7 @@ <translation id="8214489666383623925">Abrir ficheiro...</translation> <translation id="8215129063232901118">Accede ás funcións do teléfono desde o teu dispositivo (<ph name="DEVICE_TYPE" />)</translation> <translation id="8217399928341212914">Continuar bloqueando as descargas automáticas de varios ficheiros</translation> +<translation id="822050276545350872">De agora en diante xa non tes que esperar</translation> <translation id="8221491193165283816">Adoitas bloquear as notificacións. Para permitir que este sitio che envíe notificacións, fai clic aquí.</translation> <translation id="822347941086490485">Buscando dispositivos de interface humana…</translation> <translation id="8225046344534779393">Comproba a conexión a Internet</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 39bd7e04..411c7b7 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -4770,7 +4770,6 @@ <translation id="5658415415603568799">વધારાની સુરક્ષા માટે, Smart Lock તમને 20 કલાક પછી તમારો પાસવર્ડ દાખલ કરવાનું કહેશે.</translation> <translation id="5659593005791499971">ઇમેઇલ</translation> <translation id="5659833766619490117">આ પેજનો અનુવાદ કરી શકાયો નથી</translation> -<translation id="566097169318652001">તમારું ડિવાઇસ હવે કદાચ યોગ્ય રીતે કામ કરશે નહીં અને તમે સુરક્ષા તથા પર્ફોર્મન્સ સંબંધિત સમસ્યાઓ અનુભવી શકો છો. તમારી ઍપમાંની મુખ્ય સુવિધાઓ જૂની થઈ જવા પર, તે કદાચ કામ કરવાનું બંધ કરી શકે છે અને તમે કાનૂની દાવા કરવાનો તમારો હક ગુમાવશો.</translation> <translation id="5662513737565158057">Linux ઍપની કાર્ય કરવાની રીત બદલો.</translation> <translation id="5667293444945855280">મૉલવેર</translation> <translation id="5667546120811588575">Google Play સેટ કરી રહ્યાં છીએ...</translation> @@ -6092,7 +6091,6 @@ <translation id="697312151395002334">પૉપ-અપ મોકલવા અને રીડાયરેક્ટનો ઉપયોગ કરવાની મંજૂરી છે</translation> <translation id="6973611239564315524">Debian 10 માટેનું અપગ્રેડ (Buster) ઉપલબ્ધ છે</translation> <translation id="69739764870135975">જો Google તમારું ડિફૉલ્ટ શોધ એન્જિન પણ હોય, તો તમને બહેતર અને સંદર્ભ સાથે સંબંધિત સૂચનો જોવા મળશે</translation> -<translation id="6974609594866392343">ઑફલાઇન ડેમો મોડ</translation> <translation id="697508444536771064">Linux શટ ડાઉન કરો</translation> <translation id="6978121630131642226">શોધ એન્જિન</translation> <translation id="6979044105893951891">મેનેજ કરેલા અતિથિ સત્રો લૉન્ચ કરો અને બહાર નીકળો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index c52c0510..40a251e 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -4786,7 +4786,6 @@ <translation id="5658415415603568799">अतिरिक्त सुरक्षा के लिए, Smart Lock आपसे 20 घंटों के बाद अपना पासवर्ड डालने के लिए कहेगा.</translation> <translation id="5659593005791499971">ईमेल</translation> <translation id="5659833766619490117">इस पेज का अनुवाद नहीं किया जा सका</translation> -<translation id="566097169318652001">हो सकता है कि आपका डिवाइस ठीक से काम न करे. इसके अलावा, आपको सुरक्षा और परफ़ॉर्मेंस से जुड़ी समस्याएं आ सकती हैं. पुरानी हो जाने पर, हो सकता है कि ऐप्लिकेशन की मुख्य सुविधाएं काम न करें. ऐसा होने पर, आपके पास कानूनी दावा करने का अधिकार नहीं रहेगा.</translation> <translation id="5662513737565158057">Linux ऐप्लिकेशन के काम करने का तरीका बदलें.</translation> <translation id="5667293444945855280">मालवेयर</translation> <translation id="5667546120811588575">Google Play सेट अप किया जा रहा है...</translation> @@ -6107,7 +6106,6 @@ <translation id="697312151395002334">पॉप-अप भेजने और दूसरे वेबलिंक पर भेजने वाले यूआरएल का इस्तेमाल करने की अनुमति है</translation> <translation id="6973611239564315524">Debian 10 (Buster) के लिए एक अपग्रेड उपलब्ध है</translation> <translation id="69739764870135975">अगर Google आपका डिफ़ॉल्ट सर्च इंजन भी है, तो आपको बेहतर और कॉन्टेक्स्ट के हिसाब से सुझाव मिलेंगे</translation> -<translation id="6974609594866392343">ऑफ़लाइन डेमो मोड</translation> <translation id="697508444536771064">Linux को शट डाउन करें</translation> <translation id="6978121630131642226">सर्च इंजन</translation> <translation id="6979044105893951891">मेहमान के तौर पर ब्राउज़ करने के लिए प्रबंधित किए गए सेशन लॉन्च करें और उनसे बाहर आएं</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index c848f24..c106d01d 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -131,6 +131,7 @@ <translation id="1124772482545689468">Korisnik</translation> <translation id="1125550662859510761">Izgleda kao <ph name="WIDTH" /> x <ph name="HEIGHT" /> (izvorno)</translation> <translation id="1126809382673880764">Ne štiti vas od opasnih web-lokacija, preuzimanja i proširenja. Na drugim Googleovim uslugama, kao što su Gmail i Pretraživanje, i dalje ste zaštićeni Sigurnim pregledavanjem, ako je dostupno.</translation> +<translation id="1128090040635299943">Linux se trenutačno konfigurira. Konfiguracija će potrajati nekoliko minuta.</translation> <translation id="1128591060186966949">Uređivanje tražilice</translation> <translation id="1129420403709586868">Pregled fotografija i medija s vašeg telefona</translation> <translation id="1129850422003387628">Upravljanje aplikacijama</translation> @@ -334,6 +335,7 @@ <translation id="1327794256477341646">Značajke kojima je potrebna vaša lokacija neće raditi</translation> <translation id="1329191040029425999">Provjerite je li vaš uređaj ažuriran i pokušajte ponovo</translation> <translation id="1330145147221172764">Omogući tipkovnicu na zaslonu</translation> +<translation id="1331625853030156663">Da biste otvorili aplikaciju <ph name="APP_NAME" />, omogućite opciju "Prikaži zaključan zaslon prilikom vraćanja iz mirovanja"</translation> <translation id="1331977651797684645">To sam bio ja.</translation> <translation id="1333489022424033687">Neke značajke na web-lokaciji <ph name="ORIGIN" /> možda neće raditi dok ne izbrišete podatke koje su druge web-lokacije pohranile na vašem uređaju</translation> <translation id="1333965224356556482">Ne dopuštaj web-lokacijama prikazivanje vaše lokacije</translation> @@ -3334,6 +3336,7 @@ <translation id="420283545744377356">Isključivanje čuvara zaslona</translation> <translation id="4203065553461038553">Naziv datoteke ili lokacije je predug</translation> <translation id="4204851595694839599">Kakav vam je bio doživljaj igranja igara?</translation> +<translation id="4205157409548006256">Došlo je do pogreške prilikom konfiguriranja Linuxa.</translation> <translation id="4206144641569145248">Vanzemaljac</translation> <translation id="4206323443866416204">Izvješće s povratnim informacijama</translation> <translation id="4207522141889799150">Uredite dopuštenja za web-lokaciju <ph name="SITE" /></translation> @@ -4772,7 +4775,6 @@ <translation id="5658415415603568799">Za dodatnu sigurnost Smart Lock će tražiti da unesete zaporku nakon 20 sati.</translation> <translation id="5659593005791499971">e-pošta</translation> <translation id="5659833766619490117">Stranicu nije moguće prevesti</translation> -<translation id="566097169318652001">Vaš uređaj možda više neće pravilno funkcionirati i možda ćete imati problema sa sigurnošću i izvedbom. Ključne značajke u vašim aplikacijama također mogu prestati funkcionirati kad postanu zastarjele i izgubit ćete pravo na pravne zahtjeve.</translation> <translation id="5662513737565158057">Promijenite način rada Linux aplikacija.</translation> <translation id="5667293444945855280">Zlonamjerni softver</translation> <translation id="5667546120811588575">Postavljanje Google Playa...</translation> @@ -5800,6 +5802,7 @@ <translation id="6686665106869989887">Kartica je premještena udesno</translation> <translation id="6686817083349815241">Spremite zaporku</translation> <translation id="6687079240787935001">Sakrij <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">Zahtijevanje čitanja i promjene web-lokacije <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">Neka <ph name="SUPERVISED_USER_NAME" /> dođe do računala. Dijete će pročitati nekoliko izraza na ovom zaslonu da bi se izradio njegov glasovni model. <ph name="BR" /> Ako <ph name="SUPERVISED_USER_NAME" /> treba pomoć s čitanjem, neka ponavlja za vama. Šapćite dalje od mikrofona kako bi Asistent naučio prepoznavati djetetov, a ne vaš glas.</translation> @@ -6094,7 +6097,6 @@ <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> -<translation id="6974609594866392343">Izvanmrežni demo način</translation> <translation id="697508444536771064">Isključi Linux</translation> <translation id="6978121630131642226">Tražilice</translation> <translation id="6979044105893951891">Pokreni i zatvori upravljane gostujuće sesije</translation> @@ -6313,6 +6315,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Zatvori stranicu}one{Zatvori stranicu}few{Zatvori stranice}other{Zatvori stranica}}</translation> <translation id="7207457272187520234">Slanje podataka o upotrebi i dijagnostici. Ovaj uređaj trenutačno Googleu automatski šalje dijagnostičke podatke te podatke o upotrebi uređaja i aplikacija. Ti podaci pomoći će poboljšati stabilnost sustava, aplikacija i drugo. Neki skupni podaci pomoći će i Googleovim aplikacijama i partnerima, na primjer razvojnim programerima za Android. Tu postavku zadao je vlasnik. Ako je uključena dodatna aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na vaš Google račun.</translation> <translation id="7207631048330366454">Pretraži aplikacije</translation> +<translation id="720808544705441386">Aplikacija se ne može otvoriti</translation> <translation id="7210499381659830293">Pisači povezani putem proširenja</translation> <translation id="7211783048245131419">Još nije dodijeljen nijedan prekidač</translation> <translation id="7212097698621322584">Unesite svoj trenutačni PIN da biste ga promijenili. Ako ne znate PIN, vratite sigurnosni ključ na zadano, a zatim izradite novi PIN.</translation> @@ -7469,6 +7472,7 @@ <translation id="8324784016256120271">Web-lokacije mogu upotrebljavati kolačiće za uvid u vašu aktivnost pregledavanja na različitim web-lokacijama, primjerice radi prilagođavanja oglasa</translation> <translation id="8325413836429495820">Nije dopušten pregled međuspremnika</translation> <translation id="8326478304147373412">PKCS br. 7, lanac certifikata</translation> +<translation id="8327386430364625757">Matematički font</translation> <translation id="8327676037044516220">Postavke dopuštenja i sadržaja</translation> <translation id="8330617762701840933">Popis web-lokacija koje se preusmjeravaju na drugi preglednik.</translation> <translation id="8330689128072902965">Kontakti u blizini mogu dijeliti s vama. Kliknite za promjenu.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index c5aeba9..ea55ee9 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">Felhasználó</translation> <translation id="1125550662859510761">Megjelenés: <ph name="WIDTH" /> × <ph name="HEIGHT" /> (natív)</translation> <translation id="1126809382673880764">Nem védi meg Önt a veszélyes webhelyek, letöltések vagy bővítmények ellen. Ahol lehetséges (más Google-szolgáltatásokban, például a Gmailben és a Keresőben) továbbra is megkapja a Biztonságos Böngészés által nyújtott védelmet.</translation> +<translation id="1128090040635299943">Folyamatban van a Linux konfigurálása. A folyamat néhány percig tart.</translation> <translation id="1128591060186966949">Keresőmotor beállítása</translation> <translation id="1129420403709586868">Megtekintheti a telefonon található fotókat és médiatartalmakat</translation> <translation id="1129850422003387628">Alkalmazáskezelés</translation> @@ -334,6 +335,7 @@ <translation id="1327794256477341646">A helyadatokat igénylő funkciók nem működnek</translation> <translation id="1329191040029425999">Győződjön meg arról, hogy eszköze naprakész, majd próbálkozzon újra</translation> <translation id="1330145147221172764">Képernyő-billentyűzet engedélyezése</translation> +<translation id="1331625853030156663">A(z) <ph name="APP_NAME" /> megnyitáshoz engedélyezze a „Lezárási képernyő megjelenítése, az alvó módból történő felébresztéskor” beállítást</translation> <translation id="1331977651797684645">Én voltam.</translation> <translation id="1333489022424033687">Lehetséges, hogy néhány funkció nem működik a(z) <ph name="ORIGIN" /> helyen, amíg nem törli a más webhelyek által az Ön eszközén tárolt adatokat.</translation> <translation id="1333965224356556482">A webhelyek nem tekinthetik meg az Ön tartózkodási helyét</translation> @@ -3343,6 +3345,7 @@ <translation id="420283545744377356">Képernyővédő kikapcsolása</translation> <translation id="4203065553461038553">A fájl neve vagy helye túl hosszú</translation> <translation id="4204851595694839599">Milyen volt a játékélmény?</translation> +<translation id="4205157409548006256">Hiba történt a Linux konfigurálásakor.</translation> <translation id="4206144641569145248">Idegen</translation> <translation id="4206323443866416204">Visszajelzés</translation> <translation id="4207522141889799150">A webhely (<ph name="SITE" />) engedélyeinek módosítása</translation> @@ -4786,7 +4789,6 @@ <translation id="5658415415603568799">A nagyobb biztonság érdekében a Smart Lock 20 óra elteltével megkéri, hogy adja meg jelszavát.</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5659833766619490117">Nem sikerült lefordítani az oldalt</translation> -<translation id="566097169318652001">Előfordulhat, hogy az eszköz már nem működik megfelelően, és biztonsággal, illetve teljesítménnyel kapcsolatos problémákat tapasztalhat. Az alkalmazásban található kulcsfontosságú funkciók működése szintén leállhat, ha már elavulttá válnak, Ön pedig elveszíti a jogi keresetek benyújtására vonatkozó jogát.</translation> <translation id="5662513737565158057">A linuxos alkalmazások működésének módosítása.</translation> <translation id="5667293444945855280">Ártalmas program</translation> <translation id="5667546120811588575">A Google Play beállítása…</translation> @@ -5810,6 +5812,7 @@ <translation id="6686665106869989887">Lap jobbra helyezve</translation> <translation id="6686817083349815241">Jelszó mentése</translation> <translation id="6687079240787935001">A következők elrejtése: <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">A(z) <ph name="ORIGIN" /> olvasásának és módosításának kérelmezése:</translation> <translation id="6689714331348768690">Hívja a számítógéphez őt: <ph name="SUPERVISED_USER_NAME" />. Hangmintája létrehozásához gyermekének fel kell olvasnia néhány kifejezést erről a képernyőről. <ph name="BR" /> Ha <ph name="SUPERVISED_USER_NAME" /> segítségre szorul a felolvasáshoz, kérje meg, hogy ismételje Ön után. Suttogjon a mikrofontól távol, hogy a Segéd gyermeke hangját tanulja meg, ne az Önét.</translation> @@ -6103,7 +6106,6 @@ <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> -<translation id="6974609594866392343">Offline demó mód</translation> <translation id="697508444536771064">A Linux leállítása</translation> <translation id="6978121630131642226">Keresők</translation> <translation id="6979044105893951891">Felügyelt vendég-munkafolyamatok indítása és befejezése</translation> @@ -6322,6 +6324,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Oldal elhagyása}other{Oldalak elhagyása}}</translation> <translation id="7207457272187520234">Használati és diagnosztikai adatok küldése. Ez az eszköz jelenleg automatikusan küld diagnosztikai, eszköz- és alkalmazáshasználati adatokat a Google-nak. Az adatok a rendszer- és alkalmazásstabilitás javításában, valamint más fejlesztésekben segítenek. Bizonyos összesített adatok a Google-alkalmazásoknak és -partnereknek, például az Android-fejlesztőknek is segítenek. Ezt a beállítást kötelezővé tette az eszköz tulajdonosa. Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva, akkor a rendszer ezeket az adatokat az Ön Google-fiókjába is mentheti.</translation> <translation id="7207631048330366454">Alkalmazások keresése</translation> +<translation id="720808544705441386">Nem nyitható meg az alkalmazás</translation> <translation id="7210499381659830293">Bővítményalapú nyomtatók</translation> <translation id="7211783048245131419">Még nem lett hozzárendelve kapcsoló</translation> <translation id="7212097698621322584">A módosításhoz adja meg jelenlegi PIN-kódját. Ha nem tudja a PIN-kódot, vissza kell állítania a biztonsági hardverkulcsot, majd új PIN-kódot kell létrehoznia.</translation> @@ -7478,6 +7481,7 @@ <translation id="8324784016256120271">A webhelyek használhatnak cookie-kat az Ön böngészési tevékenységeinek megismeréséhez a különböző webhelyeken, például a hirdetések személyre szabása érdekében.</translation> <translation id="8325413836429495820">Nem használhatják a vágólapot</translation> <translation id="8326478304147373412">PKCS #7, tanúsítványlánc</translation> +<translation id="8327386430364625757">Matematikai betűtípus</translation> <translation id="8327676037044516220">Engedélyek és tartalombeállítások</translation> <translation id="8330617762701840933">Olyan webhelyek listája, amelyek átirányítanak alternatív böngészőkre.</translation> <translation id="8330689128072902965">A közelben lévő ismerősei megoszthatnak Önnel tartalmakat. Kattintson a módosításhoz.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index a01f957e..6eb8335 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -4771,7 +4771,6 @@ <translation id="5658415415603568799">Լրացուցիչ անվտանգության համար Smart Lock-ը ձեզ կխնդրի մուտքագրել գաղտնաբառը 20 ժամ անց։</translation> <translation id="5659593005791499971">Էլփոստ</translation> <translation id="5659833766619490117">Չհաջողվեց թարգմանել այս էջը</translation> -<translation id="566097169318652001">Հնարավոր է՝ ձեր սարքն այլևս չաշխատի պատշաճ կերպով, և ձեզ մոտ կարող են առաջանալ անվտանգության և արդյունավետության խնդիրներ։ Առանց թարմացման ձեր հավելվածների գլխավոր գործառույթները կարող են նույնպես այլևս չաշխատել, և դուք կկորցնեք իրավական պահանջներ ներկայացնելու ձեր իրավունքը։</translation> <translation id="5662513737565158057">Փոխեք Լինուքսի հավելվածների աշխատանքի հետ կապված կարգավորումները։</translation> <translation id="5667293444945855280">Վնասագիր</translation> <translation id="5667546120811588575">Google Play-ի կարգավորում...</translation> @@ -6089,7 +6088,6 @@ <translation id="697312151395002334">Թույլատրվում է ցուցադրել ելնող պատուհաններ և օգտագործել վերահասցեավորումներ</translation> <translation id="6973611239564315524">Հասանելի է Debian 10-ի (Buster) նորացում</translation> <translation id="69739764870135975">Եթե Google-ը նաև ձեր կանխադրված որոնողական համակարգն է, դուք կտեսնեք ավելի լավ և համապատասխան առաջարկներ։</translation> -<translation id="6974609594866392343">Անցանց ցուցադրական ռեժիմ</translation> <translation id="697508444536771064">Անջատել Լինուքսը</translation> <translation id="6978121630131642226">Որոնման համակարգեր</translation> <translation id="6979044105893951891">Հյուրի կառավարվող աշխատաշրջանների գործարկում և դադարեցում</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 06a1d48..5d4d83607 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -4787,7 +4787,6 @@ <translation id="5658415415603568799">Untuk tambahan keamanan, Smart Lock akan meminta Anda memasukkan sandi setelah 20 jam.</translation> <translation id="5659593005791499971">Email</translation> <translation id="5659833766619490117">Halaman ini tidak dapat diterjemahkan</translation> -<translation id="566097169318652001">Perangkat Anda mungkin tidak lagi berfungsi dengan baik, dan Anda mungkin mengalami masalah keamanan dan performa. Fitur utama di aplikasi Anda juga dapat berhenti berfungsi jika sudah usang dan Anda akan kehilangan hak untuk mengajukan klaim hukum.</translation> <translation id="5662513737565158057">Mengubah cara kerja aplikasi Linux.</translation> <translation id="5667293444945855280">Program Jahat</translation> <translation id="5667546120811588575">Menyiapkan Google Play...</translation> @@ -5641,6 +5640,7 @@ <translation id="6520876759015997832">Hasil penelusuran <ph name="LIST_POSITION" /> dari <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Tekan Enter untuk membuka bagian.</translation> <translation id="6521214596282732365">Situs biasanya menggunakan font Anda agar Anda dapat membuat konten berkualitas tinggi dengan alat desain dan grafis online</translation> <translation id="6523303810310758032">Saat Anda menghapus histori penjelajahan, baik semua histori maupun histori untuk situs tertentu, berarti Anda juga menghapus informasi pengukuran terkait. Lihat <ph name="BEGIN_LINK" />histori penjelajahan Anda<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Pengelola Sandi Google tidak dapat menyimpan sandi ini di Akun Google Anda. Anda dapat menyimpannya ke perangkat ini.</translation> <translation id="6524735478670290456">Cara kami menggunakan data ini:</translation> <translation id="652492607360843641">Anda terhubung ke jaringan <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Bagikan</translation> @@ -5945,6 +5945,7 @@ <translation id="6818198425579322765">Bahasa Asal Terjemahan Halaman</translation> <translation id="6818547713623251698">Lihat foto, media, notifikasi, dan aplikasi ponsel</translation> <translation id="6818802132960437751">Fitur perlindungan bawaan terhadap virus</translation> +<translation id="6818920801736417483">Simpan sandi?</translation> <translation id="6823174134746916417">Ketuk untuk mengklik touchpad</translation> <translation id="6824564591481349393">Salin Alamat &Email</translation> <translation id="6824584962142919697">&Periksa elemen</translation> @@ -6104,7 +6105,6 @@ <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> -<translation id="6974609594866392343">Mode demo offline</translation> <translation id="697508444536771064">Matikan Linux</translation> <translation id="6978121630131642226">Mesin Telusur</translation> <translation id="6979044105893951891">Luncurkan dan tutup sesi tamu terkelola</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 80b6ccf9..d9f006de 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -885,6 +885,7 @@ <translation id="1823098433522728610">Þetta skjal inniheldur viðkvæmt efni.</translation> <translation id="18245044880483936">Afrituð gögn eru ekki talin með í geymsluplássi barnsins á Drive.</translation> <translation id="1825565032302550710">Gátt verður að vera á milli 1024 og 65535</translation> +<translation id="182577151972096764">nýlega skoðaðar uppskriftir</translation> <translation id="1826192255355608658">Samstilltu bókamerki, aðgangsorð, feril og annað í Chrome vafranum</translation> <translation id="1826516787628120939">Kannar</translation> <translation id="1827738518074806965">Listasafn</translation> @@ -1319,6 +1320,7 @@ <translation id="2241053333139545397">Lesa og breyta gögnunum þínum á mörgum vefsvæðum</translation> <translation id="2241634353105152135">Bara einu sinni</translation> <translation id="2242687258748107519">Skráarupplýsingar</translation> +<translation id="2246129643805925002">Uppfærslur á <ph name="DEVICE_TYPE" /> verða gerðar sjálfkrafa í bakgrunni svo þú sért alltaf með nýjustu eiginleikana og öryggisúrbæturnar. Þú getur yfirfarið uppfærslustillingar í stillingunum.</translation> <translation id="2246549592927364792">Fá lýsingar á myndum frá Google?</translation> <translation id="2247738527273549923">Þessu tæki er stjórnað af fyrirtækinu þínu</translation> <translation id="2249111429176737533">Opna sem flipaglugga</translation> @@ -1611,6 +1613,7 @@ <translation id="249113932447298600">Því miður er tækið <ph name="DEVICE_LABEL" /> ekki stutt á þessari stundu.</translation> <translation id="2492461744635776704">Undirbýr beiðni um undirskrift vottorðs</translation> <translation id="2493126929778606526">Bestu myndirnar þínar, valdar sjálfkrafa</translation> +<translation id="2495524171012645395">Nýlega skoðaðar uppskriftir</translation> <translation id="2496180316473517155">Vafraferill</translation> <translation id="2497229222757901769">Músarhraði</translation> <translation id="2497852260688568942">Kerfisstjóri hefur gert samstillingu óvirka</translation> @@ -3429,6 +3432,7 @@ <translation id="4289732974614035569">Veldu PIN-númer</translation> <translation id="4290791284969893584">Þegar þú lokar síðu er óvíst að verkefnum sem þú byrjaðir á verði lokið</translation> <translation id="4291265871880246274">Innskráningargluggi</translation> +<translation id="429234155571566255">þessar nýlega skoðuðu uppskriftir</translation> <translation id="4295072614469448764">Forritið er tiltækt í skipanalínu. Einnig gæti verið tákn í ræsiforritinu.</translation> <translation id="4295979599050707005">Skráðu þig inn aftur til að staðfesta að nota megi reikninginn <ph name="USER_EMAIL" /> með vefsvæðum, forritum og viðbótum í Chrome og Google Play. Þú getur líka fjarlægt þennan reikning. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Endurræsa og endurstilla</translation> @@ -3489,6 +3493,7 @@ <translation id="435527878592612277">Veldu myndina þína</translation> <translation id="4358302248024731679">Til að geta betur greint vandamál tengd Bluetooth geta starfsmenn Google látið viðbótarannála fylgja með ábendingarskýrslum sínum fyrir Bluetooth. Þegar þessi valkostur er valinn mun skýrslan innihalda btsnoop- og HCI-annála úr yfirstandandi lotu þinni þar sem búið er að eyða eins miklu af auðkennisupplýsingum og mögulegt er. Aðgangur að þessum annálum verður takmarkaður við stjórnendur í ChromeOS vöruhópnum í Listnr. Annálar verða hreinsaðir eftir 90 daga.</translation> <translation id="4358313196493694334">Titringsvörn með smelli</translation> +<translation id="4358643842961018282">Tækið er uppfært</translation> <translation id="4359408040881008151">Sett upp vegna viðbóta sem reiða sig á hana.</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">Einkalykil þessa biðlaravottorðs vantar eða hann er ógildur</translation> @@ -4782,7 +4787,6 @@ <translation id="5658415415603568799">Smart Lock mun biðja þig um að færa inn aðgangsorðið þitt eftir 20 klukkustundir til að auka öryggið.</translation> <translation id="5659593005791499971">Netfang</translation> <translation id="5659833766619490117">Ekki var hægt að þýða þessa síðu</translation> -<translation id="566097169318652001">Tækið þitt virkar hugsanlega ekki rétt lengur og vandamál varðandi öryggi og afköst gætu komið upp. Lykileiginleikar forrita kunna einnig að hætta að virka þegar þeir eru úreltir sem veldur því að þú glatar rétti þínum til að leggja fram réttarkröfur.</translation> <translation id="5662513737565158057">Breytir því hvernig Linux-forrit virka.</translation> <translation id="5667293444945855280">Spilliforrit</translation> <translation id="5667546120811588575">Setur Google Play upp...</translation> @@ -6101,7 +6105,6 @@ <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> -<translation id="6974609594866392343">Ónettengd prufustilling</translation> <translation id="697508444536771064">Slökkva á Linux</translation> <translation id="6978121630131642226">Leitarvélar</translation> <translation id="6979044105893951891">Ræsa og loka stýrðum gestalotum</translation> @@ -7121,6 +7124,7 @@ <translation id="7981313251711023384">Forhlaða síðum til að geta leitað hraðar á netinu</translation> <translation id="798145602633458219">Hengja tillöguna <ph name="SUGGESTION_NAME" /> við leitarreit</translation> <translation id="7981662863948574132">Sýna sprettiglugga EID- og QR-kóða</translation> +<translation id="7981670705071137488">Héðan í frá munu hugbúnaðaruppfærslur fara fram í bakgrunni. Þú getur yfirfarið uppfærslustillingar í stillingunum.</translation> <translation id="7982083145464587921">Endurræstu tækið til að lagfæra þessa villu.</translation> <translation id="7982789257301363584">Net</translation> <translation id="7984068253310542383">Spegla <ph name="DISPLAY_NAME" /></translation> @@ -7364,6 +7368,7 @@ <translation id="8214489666383623925">Opna skrá...</translation> <translation id="8215129063232901118">Fáðu aðgang að eiginleikum símans í <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Halda áfram að útiloka sjálfvirkt niðurhal margra skráa</translation> +<translation id="822050276545350872">Héðan í frá þarftu ekki að bíða</translation> <translation id="8221491193165283816">Þú lokar yfirleitt á tilkynningar. Ef þú vilt leyfa þessu vefsvæði að birta þér tilkynningar skaltu smella hér.</translation> <translation id="822347941086490485">Leitar að HID-tækjum...</translation> <translation id="8225046344534779393">Athugaðu nettenginguna</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index c7d212f..07e4e4bc 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -4769,7 +4769,6 @@ <translation id="5658415415603568799">Per maggiore sicurezza, Smart Lock ti chiederà di inserire la password dopo 20 ore.</translation> <translation id="5659593005791499971">Email</translation> <translation id="5659833766619490117">Impossibile tradurre questa pagina</translation> -<translation id="566097169318652001">Il tuo dispositivo potrebbe non funzionare più correttamente e potresti riscontrare problemi di prestazioni e sicurezza. Inoltre, le funzionalità principali delle tue app potrebbero smettere di funzionare quando diventano obsolete e perderai il diritto di presentare rivendicazioni legali.</translation> <translation id="5662513737565158057">Cambia il funzionamento delle app Linux.</translation> <translation id="5667293444945855280">Malware</translation> <translation id="5667546120811588575">Configurazione di Google Play...</translation> @@ -6085,7 +6084,6 @@ <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> -<translation id="6974609594866392343">Modalità demo offline</translation> <translation id="697508444536771064">Arresta Linux</translation> <translation id="6978121630131642226">Motori di ricerca</translation> <translation id="6979044105893951891">Avvio e chiusura di sessioni Ospite gestite</translation> @@ -7587,7 +7585,7 @@ <translation id="8460932807646981183">Gestisci motori di ricerca e ricerca nei siti</translation> <translation id="84613761564611563">Interfaccia utente di configurazione rete richiesta. Attendi...</translation> <translation id="8461914792118322307">Proxy</translation> -<translation id="8463001014623882202">Autorizzazione non riuscita</translation> +<translation id="8463001014623882202">Autorizzazione negata</translation> <translation id="846374874681391779">Barra dei download</translation> <translation id="8463955938112983119">Plug-in <ph name="PLUGIN_NAME" /> disabilitato.</translation> <translation id="8464132254133862871">Questo account utente non è idoneo per il servizio.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 9ac9b72..2c7d7fa 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">משתמש</translation> <translation id="1125550662859510761">נראה כמו <ph name="WIDTH" /> x <ph name="HEIGHT" /> (במקור)</translation> <translation id="1126809382673880764">במצב הזה המערכת לא מגינה עליך מפני אתרים, הורדות ותוספים מסוכנים. גלישה בטוחה עדיין תגן עליך בשירותים אחרים של Google שבהם היא זמינה, כמו Gmail והחיפוש.</translation> +<translation id="1128090040635299943">מתבצעת עכשיו הגדרה של Linux. תהליך ההגדרה יימשך כמה דקות.</translation> <translation id="1128591060186966949">עריכת מנוע חיפוש</translation> <translation id="1129420403709586868">הצגת המדיה והתמונות שבטלפון</translation> <translation id="1129850422003387628">ניהול אפליקציות</translation> @@ -336,6 +337,7 @@ <translation id="1327794256477341646">תכונות שצריכות גישה למיקום לא יפעלו</translation> <translation id="1329191040029425999">צריך לוודא שהמכשיר מעודכן ולנסות שוב</translation> <translation id="1330145147221172764">הפעלת מקלדת על המסך</translation> +<translation id="1331625853030156663">כדי לפתוח את <ph name="APP_NAME" />, צריך להפעיל את האפשרות 'הצגת מסך הנעילה ביציאה ממצב שינה'</translation> <translation id="1331977651797684645">זה הייתי אני.</translation> <translation id="1333489022424033687">ייתכן שתכונות מסוימות ב-<ph name="ORIGIN" /> לא יפעלו עד שיוסרו נתונים שאתרים אחרים אחסנו במכשיר שלך</translation> <translation id="1333965224356556482">לא לאפשר לאתרים לראות את המיקום שלך</translation> @@ -883,6 +885,7 @@ <translation id="1823098433522728610">המסמך הזה מכיל תוכן רגיש.</translation> <translation id="18245044880483936">נתוני הגיבוי לא נחשבים כחלק ממכסת האחסון של הילד או הילדה ב-Drive.</translation> <translation id="1825565032302550710">היציאה חייבת להיות בין 1024 ל-65535</translation> +<translation id="182577151972096764">מתכונים שצפית בהם לאחרונה</translation> <translation id="1826192255355608658">סנכרון הסימניות, הסיסמאות, ההיסטוריה והגדרות נוספות של דפדפן Chrome</translation> <translation id="1826516787628120939">מתבצעת בדיקה</translation> <translation id="1827738518074806965">גלריית אומנות</translation> @@ -1317,6 +1320,7 @@ <translation id="2241053333139545397">לקרוא ולשנות את הנתונים שלך במספר אתרים</translation> <translation id="2241634353105152135">פעם אחת בלבד</translation> <translation id="2242687258748107519">פרטי קובץ</translation> +<translation id="2246129643805925002">העדכונים של <ph name="DEVICE_TYPE" /> יתבצעו באופן אוטומטי ברקע, כדי שניתן יהיה ליהנות מהתכונות ומשיפורי האבטחה האחרונים. אפשר לנהל את ההעדפות לגבי עדכונים בהגדרות.</translation> <translation id="2246549592927364792">רוצה לקבל תיאורי תמונות מ-Google?</translation> <translation id="2247738527273549923">המכשיר מנוהל על ידי הארגון שלך</translation> <translation id="2249111429176737533">פתיחה בחלון מרובה כרטיסיות</translation> @@ -1609,6 +1613,7 @@ <translation id="249113932447298600">מצטערים, המכשיר <ph name="DEVICE_LABEL" /> אינו נתמך בשלב זה.</translation> <translation id="2492461744635776704">המערכת מכינה את בקשת החתימה על אישור</translation> <translation id="2493126929778606526">התמונות הטובות ביותר שלך שנבחרו באופן אוטומטי</translation> +<translation id="2495524171012645395">מתכונים שצפית בהם לאחרונה</translation> <translation id="2496180316473517155">היסטוריית גלישה</translation> <translation id="2497229222757901769">מהירות עכבר</translation> <translation id="2497852260688568942">מנהל המערכת שלך השבית את הסנכרון</translation> @@ -3343,6 +3348,7 @@ <translation id="420283545744377356">השבתה של שומר המסך</translation> <translation id="4203065553461038553">שם הקובץ או הנתיב שלו ארוכים מדי</translation> <translation id="4204851595694839599">איך הייתה החוויה של מהלך המשחק (gameplay)?</translation> +<translation id="4205157409548006256">אירעה שגיאה במהלך ההגדרה של Linux.</translation> <translation id="4206144641569145248">חייזר</translation> <translation id="4206323443866416204">דוח משוב</translation> <translation id="4207522141889799150">עריכה של הרשאות האתר <ph name="SITE" /></translation> @@ -3429,6 +3435,7 @@ <translation id="4289732974614035569">בחירת קוד אימות</translation> <translation id="4290791284969893584">לאחר סגירת דף, ייתכן שמשימות שהתחלת לא יסתיימו</translation> <translation id="4291265871880246274">תיבת דו-שיח להתחברות</translation> +<translation id="429234155571566255">המתכונים האלה שצפית בהם לאחרונה</translation> <translation id="4295072614469448764">האפליקציה זמינה במסוף שלך. בחלק מהמקרים מופיע סמל במרכז האפליקציות.</translation> <translation id="4295979599050707005">יש להיכנס שוב כדי לאשר את השימוש בחשבון שלך, <ph name="USER_EMAIL" />, ביחד עם אתרים, אפליקציות ותוספים ב-Chrome וב-Google Play. ניתן גם להסיר את החשבון הזה. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="4297219207642690536">הפעלה מחדש ואתחול</translation> @@ -3489,6 +3496,7 @@ <translation id="435527878592612277">בחירת התמונה שלך</translation> <translation id="4358302248024731679">כדי לשפר את האבחון של בעיות בחיבור Bluetooth, גוגלרים יכולים לכלול יומני Bluetooth נוספים בדוחות המשוב שלהם. כשמסמנים את האפשרות הזו, הדוח יכלול את יומני btsnoop ו-HCI מהסשן הנוכחי, שיעברו ניקוי כדי להסיר כמה שיותר פרטים אישיים מזהים (PII). הגישה ליומנים האלה תוגבל למנהלים של קבוצת מוצרי ChromeOS ב-Listnr. היומנים יימחקו לצמיתות לאחר 90 ימים.</translation> <translation id="4358313196493694334">ייצוב מיקום הקליק</translation> +<translation id="4358643842961018282">המכשיר שלך מעודכן</translation> <translation id="4359408040881008151">הותקן מפני שיש תוספים התלויים בו.</translation> <translation id="4359717112757026264">נוף עירוני</translation> <translation id="4361142739114356624">המפתח הפרטי לאישור לקוח זה חסר או אינו חוקי</translation> @@ -4782,7 +4790,6 @@ <translation id="5658415415603568799">לשיפור האבטחה, אחרי 20 שעות תוצג לך בקשה מ-Smart Lock להזין את הסיסמה שלך.</translation> <translation id="5659593005791499971">אימייל</translation> <translation id="5659833766619490117">לא ניתן היה לתרגם את הדף הזה</translation> -<translation id="566097169318652001">יכול להיות שהמכשיר שלך לא יעבוד כמו שצריך ושיהיו בעיות באבטחה ובביצועים. בנוסף, תכונות מרכזיות באפליקציות עשויות להפסיק לפעול כשהן יתיישנו וייתכן שלא תהיה לך זכות להגיש תביעה משפטית.</translation> <translation id="5662513737565158057">שינוי אופן הפעולה של אפליקציות Linux.</translation> <translation id="5667293444945855280">תוכנה זדונית</translation> <translation id="5667546120811588575">הגדרת Google Play מתבצעת...</translation> @@ -5810,6 +5817,7 @@ <translation id="6686665106869989887">הכרטיסייה הועברה שמאלה</translation> <translation id="6686817083349815241">שמירת הסיסמה שלך</translation> <translation id="6687079240787935001">הסתרה של <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">התקבלה בקשה מהתוסף לקרוא ולשנות את <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">צריך לבקש מ<ph name="SUPERVISED_USER_NAME" /> לגשת למחשב. הילד או הילדה יקריאו מספר ביטויים שיופיעו במסך הזה כדי ליצור את תבנית הקול שלהם. <ph name="BR" /> אם ל<ph name="SUPERVISED_USER_NAME" /> נדרשת עזרה בקריאה, אפשר להציע לילד או לילדה לחזור על הביטוי אחריך. צריך ללחוש הרחק מהמיקרופון כדי ש-Assistant תלמד להכיר את הקול של הילד או הילדה ולא את הקול שלך.</translation> @@ -6103,7 +6111,6 @@ <translation id="697312151395002334">מורשים להציג חלונות קופצים ולהשתמש בהפניות אוטומטיות</translation> <translation id="6973611239564315524">קיים עדכון זמין ל-Debian 10 (Buster)</translation> <translation id="69739764870135975">אם Google הוא גם מנוע החיפוש המוגדר אצלך כברירת מחדל, יוצגו לך הצעות משופרות ורלוונטיות מבחינת הקשר.</translation> -<translation id="6974609594866392343">מצב הדגמה לא מקוון</translation> <translation id="697508444536771064">כיבוי Linux</translation> <translation id="6978121630131642226">מנועי חיפוש</translation> <translation id="6979044105893951891">הפעלה של גלישות מנוהלות כאורח, ויציאה מהן</translation> @@ -6322,6 +6329,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{יציאה מהדף}two{יציאה מהדפים}many{יציאה מהדפים}other{יציאה מהדפים}}</translation> <translation id="7207457272187520234">שליחת מידע לגבי אופן השימוש בנתונים וניתוח הביצועים. המכשיר הזה שולח עכשיו אל Google באופן אוטומטי נתוני אבחון, נתוני מכשיר ונתוני שימוש באפליקציות. הנתונים האלה יעזרו לשמור על היציבות של המערכת ושל האפליקציות ולבצע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לשפר את האפליקציות של Google וכן יעזרו לשותפים של Google, כמו מפתחים של Android. ההגדרה הזו נאכפת על-ידי הבעלים. אם הופעלה ההגדרה 'פעילות באפליקציות ובאתרי אינטרנט נוספים', ייתכן שהנתונים יישמרו בחשבון Google שלך.</translation> <translation id="7207631048330366454">חיפוש אפליקציות</translation> +<translation id="720808544705441386">לא ניתן לפתוח את האפליקציה</translation> <translation id="7210499381659830293">מדפסות בתוסף</translation> <translation id="7211783048245131419">עוד לא הוקצו מתגים.</translation> <translation id="7212097698621322584">צריך להזין את קוד האימות הנוכחי כדי לשנות אותו. אם קוד האימות לא ידוע לך, צריך לאפס את מפתח האבטחה ולאחר מכן ליצור קוד אימות חדש.</translation> @@ -7122,6 +7130,7 @@ <translation id="7981313251711023384">טעינה מראש של דפים כדי לאפשר גלישה וחיפוש מהירים יותר</translation> <translation id="798145602633458219">הצמדת ההצעה <ph name="SUGGESTION_NAME" /> לתיבת החיפוש</translation> <translation id="7981662863948574132">הצגת החלון הקופץ של מספר ה-EID וקוד ה-QR של המכשיר</translation> +<translation id="7981670705071137488">בסיום ההורדה, עדכוני תוכנה יתבצעו ברקע. אפשר לנהל את ההעדפות לגבי עדכונים בהגדרות.</translation> <translation id="7982083145464587921">כדאי לאתחל את המכשיר כדי לתקן את השגיאה.</translation> <translation id="7982789257301363584">רשת</translation> <translation id="7984068253310542383">שיקוף מסך של <ph name="DISPLAY_NAME" /></translation> @@ -7368,6 +7377,7 @@ <translation id="8214489666383623925">פתיחת קובץ...</translation> <translation id="8215129063232901118">אפשר ליהנות מהיכולות של הטלפון ב-<ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">להמשיך לחסום הורדות אוטומטיות של קבצים מרובים</translation> +<translation id="822050276545350872">מעכשיו, לא יהיה צורך להמתין יותר</translation> <translation id="8221491193165283816">הבחירה שלך היא בדרך כלל לחסום התראות. כדי לאפשר לאתר הזה להציג התראות יש ללחוץ כאן.</translation> <translation id="822347941086490485">מתבצע חיפוש של מכשירי HID...</translation> <translation id="8225046344534779393">צריך לבדוק את החיבור לאינטרנט</translation> @@ -7478,6 +7488,7 @@ <translation id="8324784016256120271">אתרים יכולים להשתמש בקובצי cookie כדי לראות את פעילות הגלישה שלך באתרים שונים, למשל לצורך התאמה אישית של מודעות</translation> <translation id="8325413836429495820">לא מורשים לראות את הלוח</translation> <translation id="8326478304147373412">PKCS #7, שרשרת אישורים</translation> +<translation id="8327386430364625757">גופן מתמטי</translation> <translation id="8327676037044516220">הגדרות תוכן והרשאות</translation> <translation id="8330617762701840933">רשימת האתרים שמפנים לדפדפן חלופי.</translation> <translation id="8330689128072902965">אנשי קשר בקרבת מקום יכולים לשתף איתך. אפשר ללחוץ כדי לשנות.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index f6dad4ee..b03a385 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -4757,7 +4757,6 @@ <translation id="5658415415603568799">セキュリティ強化のため、Smart Lock では 20 時間が経過するとパスワードの入力が求められます。</translation> <translation id="5659593005791499971">メール</translation> <translation id="5659833766619490117">このページを翻訳できませんでした</translation> -<translation id="566097169318652001">お使いのデバイスは正しく動作していない可能性があり、セキュリティやパフォーマンス上の問題が発生することがあります。アプリの主な機能が期限切れとなった場合、動作が停止する可能性もあります。その場合、ユーザーは法的申し立てを行う権利を失います。</translation> <translation id="5662513737565158057">Linux アプリの動作を変更します。</translation> <translation id="5667293444945855280">マルウェア</translation> <translation id="5667546120811588575">Google Play を設定しています...</translation> @@ -6069,7 +6068,6 @@ <translation id="697312151395002334">ポップアップの送信やリダイレクトの使用を許可するサイト</translation> <translation id="6973611239564315524">Debian 10(Buster)にアップグレードできます</translation> <translation id="69739764870135975">既定の検索エンジンが Google の場合は、コンテンツとより関連性の高い候補が表示されます</translation> -<translation id="6974609594866392343">オフライン デモモード</translation> <translation id="697508444536771064">Linux をシャットダウン</translation> <translation id="6978121630131642226">検索エンジン</translation> <translation id="6979044105893951891">管理対象のゲスト セッションの開始と終了</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index a514b8c..af1f1e0 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -131,6 +131,7 @@ <translation id="1124772482545689468">მომხმარებელი</translation> <translation id="1125550662859510761">როგორც ჩანს, გარჩევადობა არის <ph name="WIDTH" /> x <ph name="HEIGHT" /> (საკუთარი)</translation> <translation id="1126809382673880764">არ დაგიცავთ სახიფათო ვებსაიტებისგან, ჩამოტვირთვებისა თუ გაფართოებებისგან. Safe Browsing-ის დაცვით (ხელმისაწვდომობის მიხედვით) მაინც ისარგებლებთ სხვა Google სერვისებში, როგორიცაა Gmail თუ Search.</translation> +<translation id="1128090040635299943">ამჟამად მიმდინარეობს Linux-ის კონფიგურაცია. კონფიგურაციას რამდენიმე წუთი დასჭირდება.</translation> <translation id="1128591060186966949">საძიებო სისტემის რედაქტირება</translation> <translation id="1129420403709586868">ნახეთ თქვენი ტელეფონის ფოტოები და მედია</translation> <translation id="1129850422003387628">აპების მართვა</translation> @@ -332,6 +333,7 @@ <translation id="1327794256477341646">ფუნქციები, რომლებიც თქვენს მდებარეობას საჭიროებს, არ იმუშავებს</translation> <translation id="1329191040029425999">დარწმუნდით, რომ თქვენი მოწყობილობა განახლებულია და ცადეთ ხელახლა</translation> <translation id="1330145147221172764">ეკრანული კლავიატურის ჩართვა</translation> +<translation id="1331625853030156663"><ph name="APP_NAME" /> რომ გახსნათ, ჩართეთ „ძილიდან გამოღვიძებისას ჩაკეტილი ეკრანის ჩვენება“</translation> <translation id="1331977651797684645">ეს მე ვიყავი.</translation> <translation id="1333489022424033687"><ph name="ORIGIN" />-ის ზოგიერთმა ფუნქციამ შეიძლება არ იმუშაოს, სანამ თქვენს მოწყობილობაში სხვა საიტების მიერ შენახულ მონაცემებს არ გაასუფთავებთ</translation> <translation id="1333965224356556482">საიტებისთვის თქვენი მდებარეობის ნახვის აკრძალვა</translation> @@ -1953,6 +1955,7 @@ <translation id="2832124733806557606">თქვენს შვილს სისტემაში შესვლა ან მოწყობილობის განბლოკვა PIN-კოდის მეშვეობით შეუძლია.</translation> <translation id="2835177225987815960">სკანირებასთან დაკავშირებით ამჟამად განსაზღვრული პარამეტრები გადაყენდება, მათ შორის, გადამრთველები და ავტომატური სკანირების სიჩქარესთან დაკავშირებით დაფიქსირებული არჩევანი.</translation> <translation id="2835547721736623118">მეტყველების ამოცნობის სერვისი</translation> +<translation id="2836232638504556905">გასაგრძელებლად <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ამ საიტს გაუზიარებს თქვენს სახელს, ელფოსტის მისამართსა და პროფილის სურათს. გაეცანით ამ საიტის <ph name="BEGIN_LINK" />კონფიდენციალურობის დებულებას<ph name="END_LINK" />.</translation> <translation id="2836269494620652131">შეცდომა</translation> <translation id="2836635946302913370">მომხმარებლის ამ სახელით სისტემაში შესვლა გათიშულია თქვენი ადმინისტრატორის მიერ.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> ქსელის გამოსაყენებლად, ჯერ დაასრულეთ ინტერნეტთან დაკავშირება ქვემოთ.</translation> @@ -2234,6 +2237,7 @@ <translation id="3105796011181310544">გსურთ Google-ზე დაბრუნება?</translation> <translation id="310671807099593501">საიტი იყენებს Bluetooth-კავშირს</translation> <translation id="3108931485517391283">მიღება ვერ მოხერხდა</translation> +<translation id="3109206895301430738">ჩანართების შენახული ჯგუფები</translation> <translation id="3109724472072898302">აკეცილი</translation> <translation id="311214366526552035">მაინც ჩამოტვირთვა</translation> <translation id="3112292765614504292">აპის ზომა: <ph name="APP_SIZE" /></translation> @@ -3331,6 +3335,7 @@ <translation id="420283545744377356">ეკრანმზოგის გამორთვა</translation> <translation id="4203065553461038553">ფაილის სახელი ან მდებარეობა ზედმეტად დიდია</translation> <translation id="4204851595694839599">როგორი იყო თამაშის პროცესი?</translation> +<translation id="4205157409548006256">Linux-ის კონფიგურაციისას შეცდომა მოხდა.</translation> <translation id="4206144641569145248">უცხოპლანეტელი</translation> <translation id="4206323443866416204">გამოხმაურების ანგარიში</translation> <translation id="4207522141889799150">საიტის ნებართვების რედაქტირება <ph name="SITE" />-ისთვის.</translation> @@ -4771,7 +4776,6 @@ <translation id="5658415415603568799">დამატებითი უსაფრთხოებისთვის Smart Lock გთხოვთ პაროლის შეყვანას 20 საათის შემდეგ.</translation> <translation id="5659593005791499971">ელფოსტა</translation> <translation id="5659833766619490117">ეს გვერდი ვერ ითარგმნა</translation> -<translation id="566097169318652001">თქვენმა მოწყობილობამ, შესაძლოა, სათანადოდ აღარ იმუშაოს, უსაფრთხოებასა და წარმადობასთან კი გარკვეული პრობლემები შეგექმნათ. ამასთან, შესაძლოა თქვენი აპების ძირითადმა ფუნქციებმაც შეწყვიტოს მუშაობა, როცა ისინი მოძველდება, რაც, თავის მხრივ, წაგართმევთ კანონიერი მოთხოვნების წარმოდგენის უფლებას.</translation> <translation id="5662513737565158057">შეცვალეთ Linux აპების მუშაობის პრინციპი.</translation> <translation id="5667293444945855280">საზიანო პროგრამა</translation> <translation id="5667546120811588575">მიმდინარეობს Google Play-ს დაყენება...</translation> @@ -5796,6 +5800,7 @@ <translation id="6686665106869989887">ჩანართი გადატანილია მარჯვნივ</translation> <translation id="6686817083349815241">შეინახეთ თქვენი პაროლი</translation> <translation id="6687079240787935001">დამალოს <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">ითხოვს, წაიკითხოს და შეცვალოს <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">სთხოვეთ <ph name="SUPERVISED_USER_NAME" />-ს, მოვიდეს კომპიუტერთან. თქვენმა ბავშვმა ამ ეკრანიდან რამდენიმე ფრაზა უნდა წაიკითხოს, თავისი ხმის მოდელი რომ შექმნას. <ph name="BR" /> თუ <ph name="SUPERVISED_USER_NAME" /> კითხვაში დახმარებას საჭიროებს, სთხოვეთ, თქვენ მიერ წარმოთქმული გაიმეოროს. ჩაუჩურჩულეთ მას მიკროფონისგან მოშორებით, რომ ასისტენტმა თქვენი შვილის ხმის ამოცნობა ისწავლოს და არა თქვენი.</translation> @@ -6090,7 +6095,6 @@ <translation id="697312151395002334">ამომხტარი ფანჯრების გამოგზავნა და გადამისამართებების გამოყენება დაშვებულია</translation> <translation id="6973611239564315524">ხელმისაწვდომია Debian 10-ზე (Buster) განახლება</translation> <translation id="69739764870135975">თუ Google თქვენი ნაგულისხმევი საძიებო სისტემაცაა, უკეთეს, კონტექსტური თვალსაზრისით შესაფერის, შემოთავაზებებს იხილავთ</translation> -<translation id="6974609594866392343">ხაზგარეშე დემო-რეჟიმი</translation> <translation id="697508444536771064">Linux-ის გამორთვა</translation> <translation id="6978121630131642226">საძიებო სისტემები</translation> <translation id="6979044105893951891">სტუმრების მართული სესიების გაშვება და სესიებიდან გასვლა</translation> @@ -6309,6 +6313,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{გვერდიდან გასვლა}other{გვერდებიდან გასვლა}}</translation> <translation id="7207457272187520234">გამოყენებისა და დიაგნოსტიკის მონაცემების გაგზავნა. ეს მოწყობილობა ამჟამად ავტომატურად უგზავნის Google-ს დიაგნოსტიკისა და მოწყობილობის/აპების გამოყენების მონაცემებს. აღნიშნული მონაცემები დაგვეხმარება სისტემის/აპების სტაბილურობისა და სხვა ფუნქციების გაუმჯობესებაში. გარდა ამისა, გაერთიანებული მონაცემების ნაწილი ხელს შეუწყობს Google აპებსა და პარტნიორებს, მაგალითად, Android-ის დეველოპერებს. ეს პარამეტრი არის იძულებით გააქტიურებული მფლობელის მიერ. თუ ჩართული გაქვთ ვებსა და აპებში დამატებითი აქტივობის პარამეტრი, აღნიშნული მონაცემები შესაძლოა შეინახოს თქვენს Google ანგარიშში.</translation> <translation id="7207631048330366454">აპებში ძიება</translation> +<translation id="720808544705441386">აპის გახსნა ვერ ხერხდება</translation> <translation id="7210499381659830293">გაფართოების პრინტერები</translation> <translation id="7211783048245131419">გადამრთველი ჯერ არ მინიჭებულა</translation> <translation id="7212097698621322584">შესაცვლელად შეიყვანეთ თქვენი ამჟამინდელი PIN-კოდი. თუ PIN-კოდი არ იცით, საჭირო იქნება უსაფრთხოების გასაღების გადაყენება და ახალი PIN-კოდის შექმნა.</translation> @@ -7464,6 +7469,7 @@ <translation id="8324784016256120271">საიტები გამოიყენებს ქუქი-ჩანაწერებს სხვადასხვა საიტის თქვენ მიერ დათვალიერების აქტივობის სანახავად, მაგალითად, რეკლამის პერსონალიზების მიზნით</translation> <translation id="8325413836429495820">თქვენი გაცვლის ბუფერის ნახვა დაუშვებელია</translation> <translation id="8326478304147373412">PKCS #7, სერთიფიკატის ჯაჭვი</translation> +<translation id="8327386430364625757">მათემატიკური შრიფტი</translation> <translation id="8327676037044516220">ნებართვებისა და კონტენტის პარამეტრები</translation> <translation id="8330617762701840933">იმ ვებსაიტების სია, რომლებიც მისამართდება ალტერნატიულ ბრაუზერში.</translation> <translation id="8330689128072902965">ახლომახლო კონტაქტებს შეუძლიათ თქვენთვის გაზიარება. დააწკაპუნეთ შესაცვლელად.</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index b3a17f6..32a14e6 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -4765,7 +4765,6 @@ <translation id="5658415415603568799">Қауіпсіздікті күшейту үшін Smart Lock функциясы 20 сағаттан кейін құпия сөзді енгізуді сұрауы мүмкін.</translation> <translation id="5659593005791499971">Электрондық пошта</translation> <translation id="5659833766619490117">Бет аударылмады</translation> -<translation id="566097169318652001">Құрылғыңыз енді дұрыс жұмыс істемей, өнімділікке және қауіпсіздікке қатысты ақаулар пайда болуы мүмкін. Құрылғыдағы негізгі функциялар ескірген кезде, олар да жұмысын тоқтатуы мүмкін. Осыған байланысты сіздің заң тарапынан шағымдану құқығыңыз да жойылады.</translation> <translation id="5662513737565158057">Linux қолданбаларының жұмыс істеу жолын өзгертіңіз.</translation> <translation id="5667293444945855280">Зиянды бағдарлама</translation> <translation id="5667546120811588575">Google Play орнатылуда...</translation> @@ -5618,6 +5617,7 @@ <translation id="6520876759015997832"><ph name="LIST_POSITION" />/<ph name="LIST_SIZE" /> іздеу нәтижесі: <ph name="SEARCH_RESULT_TEXT" />. Бөлімге өту үшін Enter пернесін басыңыз.</translation> <translation id="6521214596282732365">Сайттар әдетте сіздің қаріптеріңізді пайдаланады, сондықтан дизайн мен графикаға арналған онлайн құралдардың көмегімен жоғары сапалы мазмұн құруыңызға болады.</translation> <translation id="6523303810310758032">Барлық немесе белгілі бір сайттағы браузерді қолдану тарихын жойған кезде, оған қатысты өлшем ақпараты да жойылады. <ph name="BEGIN_LINK" />Браузерді қолдану тарихын<ph name="END_LINK" /> қараңыз.</translation> +<translation id="6523574494641144162">Google Құпия сөз менеджері бұл құпия сөздерді Google аккаунтыңызға сақтай алмады. Оларды осы құрылғыға сақтай аласыз.</translation> <translation id="6524735478670290456">Бұл дерек қалай пайдаланылады:</translation> <translation id="652492607360843641"><ph name="NETWORK_TYPE" /> желісіне жалғандыңыз.</translation> <translation id="6527303717912515753">Бөлісу</translation> @@ -5922,6 +5922,7 @@ <translation id="6818198425579322765">Беттің аударма тілі</translation> <translation id="6818547713623251698">Телефондағы фотосуреттерді, медиафайлдарды, хабарландырулар мен қолданбаларды көру</translation> <translation id="6818802132960437751">Ендірілген вирустан қорғау жүйесі</translation> +<translation id="6818920801736417483">Құпия сөздер сақталсын ба?</translation> <translation id="6823174134746916417">Сенсорлық тақтаны басу үшін түрту</translation> <translation id="6824564591481349393">&Электрондық пошта мекенжайын көшіру</translation> <translation id="6824584962142919697">&Элементтерді тексеру</translation> @@ -6081,7 +6082,6 @@ <translation id="697312151395002334">Қалқымалы терезелерді жіберу мен бағытты ауыстыру функцияларын пайдалануға рұқсаты барлар</translation> <translation id="6973611239564315524">Debian 10 (Buster) нұсқасы қолжетімді</translation> <translation id="69739764870135975">Егер Google әдепкі іздеу жүйесі болса, сізге тиімді, контекске сай ұсыныстар беріледі.</translation> -<translation id="6974609594866392343">Офлайн демо режимі</translation> <translation id="697508444536771064">Linux виртуалды құрылғысын өшіру</translation> <translation id="6978121630131642226">Іздеу жүйелері</translation> <translation id="6979044105893951891">Басқарылатын қонақ сеанстарын іске қосу және олардан шығу</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index b3fbd17c..0f79f6c 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -4788,7 +4788,6 @@ <translation id="5658415415603568799">ដើម្បីទទួលបានសុវត្ថិភាពបន្ថែម Smart Lock នឹងស្នើសុំឲ្យអ្នកបញ្ចូលពាក្យសម្ងាត់របស់អ្នកបន្ទាប់ពីរយៈពេល 20 ម៉ោង។</translation> <translation id="5659593005791499971">អ៊ីម៉េល</translation> <translation id="5659833766619490117">មិនអាចបកប្រែទំព័រនេះបានទេ</translation> -<translation id="566097169318652001">ឧបករណ៍របស់អ្នកប្រហែលជាមិនដំណើរការត្រឹមត្រូវទៀតទេ ហើយអ្នកប្រហែលជាមានបញ្ហាពាក់ព័ន្ធនឹងសុវត្ថិភាព និងប្រតិបត្តិការ។ មុខងារសំខាន់ៗនៅក្នុងកម្មវិធីរបស់អ្នកក៏ប្រហែលជាឈប់ដំណើរការផងដែរ នៅពេលមុខងារទាំងនោះហួសសម័យ ហើយអ្នកនឹងបាត់បង់សិទ្ធិរបស់អ្នកក្នុងការទាមទារស្របច្បាប់។</translation> <translation id="5662513737565158057">ផ្លាស់ប្ដូររបៀបដែលកម្មវិធី Linux នឹងដំណើរការ។</translation> <translation id="5667293444945855280">មេរោគ</translation> <translation id="5667546120811588575">កំពុងរៀបចំ Google Play...</translation> @@ -6105,7 +6104,6 @@ <translation id="697312151395002334">អនុញ្ញាតឱ្យផ្ញើផ្ទាំងលោតឡើង និងប្រើការបញ្ជូនបន្ត</translation> <translation id="6973611239564315524">មានកំណែថ្មីសម្រាប់ដំឡើងទៅ Debian 10 (Buster)</translation> <translation id="69739764870135975">ប្រសិនបើ Google ក៏ជាម៉ាស៊ីនស្វែងរកលំនាំដើមរបស់អ្នកដែរ អ្នកនឹងមើលឃើញការណែនាំដែលពាក់ព័ន្ធតាមបរិបទកាន់តែប្រសើរ</translation> -<translation id="6974609594866392343">មុខងារសាកល្បងគ្មានអ៊ីនធឺណិត</translation> <translation id="697508444536771064">បិទ Linux</translation> <translation id="6978121630131642226">ម៉ាស៊ីនស្វែងរក</translation> <translation id="6979044105893951891">ចាប់ផ្ដើម និងចាកចេញពីវេនភ្ញៀវដែលស្ថិតក្រោមការគ្រប់គ្រង</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 8fff7cd..983c91b 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -878,6 +878,7 @@ <translation id="1823098433522728610">ಈ ಡಾಕ್ಯುಮೆಂಟ್ ಸೂಕ್ಷ್ಮ ವಿಷಯವನ್ನು ಹೊಂದಿದೆ.</translation> <translation id="18245044880483936">ನಿಮ್ಮ ಮಗುವಿನ ಡ್ರೈವ್ ಸಂಗ್ರಹಣೆ ಕೋಟಾದಲ್ಲಿ ಬ್ಯಾಕಪ್ ಡೇಟಾ ಸೇರಿರುವುದಿಲ್ಲ.</translation> <translation id="1825565032302550710">ಪೋರ್ಟ್ 1024 ಮತ್ತು 65535 ಆಗಿರಬೇಕು</translation> +<translation id="182577151972096764">ಇತ್ತೀಚೆಗೆ ವೀಕ್ಷಿಸಿದ ರೆಸಿಪಿಗಳು</translation> <translation id="1826192255355608658">ನಿಮ್ಮ Chrome ಬ್ರೌಸರ್ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಪಾಸ್ವರ್ಡ್ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="1826516787628120939">ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="1827738518074806965">ಆರ್ಟ್ ಗ್ಯಾಲರಿ</translation> @@ -1311,6 +1312,7 @@ <translation id="2241053333139545397">ಹಲವಾರು ವೆಬ್ಸೈಟ್ಗಳಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಓದಿ ಮತ್ತು ಬದಲಾಯಿಸಿ</translation> <translation id="2241634353105152135">ಕೇವಲ ಒಂದು ಬಾರಿ</translation> <translation id="2242687258748107519">ಫೈಲ್ ಮಾಹಿತಿ</translation> +<translation id="2246129643805925002">ನಿಮಗೆ ಇತ್ತೀಚಿನ ವೈಶಿಷ್ಟ್ಯಗಳು ಮತ್ತು ಭದ್ರತಾ ಸುಧಾರಣೆಗಳನ್ನು ನೀಡಲು, ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಪ್ಡೇಟ್ ಆಗುತ್ತದೆ. ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅಪ್ಡೇಟ್ ಆದ್ಯತೆಗಳನ್ನು ಪರಿಶೀಲಿಸಬಹುದು.</translation> <translation id="2246549592927364792">Google ನಿಂದ ಚಿತ್ರದ ವಿವರಣೆಗಳನ್ನು ಪಡೆಯುವುದೇ?</translation> <translation id="2247738527273549923">ನಿಮ್ಮ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="2249111429176737533">ಟ್ಯಾಬ್ ಆಗಿರುವ ವಿಂಡೋದ ಹಾಗೆ ತೆರೆಯಿರಿ</translation> @@ -1603,6 +1605,7 @@ <translation id="249113932447298600">ಕ್ಷಮಿಸಿ, ಈ ಸಮಯದಲ್ಲಿ <ph name="DEVICE_LABEL" /> ಸಾಧನಕ್ಕೆ ಬೆಂಬಲ ದೊರೆಯುತ್ತಿಲ್ಲ.</translation> <translation id="2492461744635776704">ಪ್ರಮಾಣಪತ್ರಕ್ಕೆ ಸಹಿ ಮಾಡುವ ವಿನಂತಿಯನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="2493126929778606526">ನಿಮ್ಮ ಅತ್ಯುತ್ತಮ ಫೋಟೋಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಯ್ಕೆಮಾಡಲಾಗುತ್ತದೆ</translation> +<translation id="2495524171012645395">ಇತ್ತೀಚೆಗೆ ವೀಕ್ಷಿಸಿದ ರೆಸಿಪಿಗಳು</translation> <translation id="2496180316473517155">ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ</translation> <translation id="2497229222757901769">ಮೌಸ್ ವೇಗ</translation> <translation id="2497852260688568942">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸಿಂಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ</translation> @@ -3422,6 +3425,7 @@ <translation id="4289732974614035569">ಪಿನ್ ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="4290791284969893584">ಪುಟವನ್ನು ಮುಚ್ಚಿದ ನಂತರ, ನೀವು ಪ್ರಾರಂಭಿಸಿದ ಕಾರ್ಯಗಳು ಪೂರ್ಣಗೊಳ್ಳದಿರಬಹುದು</translation> <translation id="4291265871880246274">ಲಾಗಿನ್ ಡೈಲಾಗ್</translation> +<translation id="429234155571566255">ಈ ಇತ್ತೀಚೆಗೆ ವೀಕ್ಷಿಸಿದ ರೆಸಿಪಿಗಳು</translation> <translation id="4295072614469448764">ನಿಮ್ಮ ಟರ್ಮಿನಲ್ನಲ್ಲಿಯೇ ಆ್ಯಪ್ ಲಭ್ಯವಿದೆ. ನಿಮ್ಮ ಲಾಂಚರ್ನಲ್ಲಿ ಒಂದು ಐಕಾನ್ ಸಹ ಲಭ್ಯವಿರಬಹುದು.</translation> <translation id="4295979599050707005">ನಿಮ್ಮ <ph name="USER_EMAIL" /> ಖಾತೆಯನ್ನು Chrome ಮತ್ತು Google Play ನಲ್ಲಿ ವೆಬ್ಸೈಟ್ಗಳು, ಆ್ಯಪ್ಗಳು ಮತ್ತು ವಿಸ್ತರಣೆಗಳ ಜೊತೆಗೆ ಬಳಸಬಹುದು ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಲು, ಮತ್ತೊಮ್ಮೆ ಸೈನ್ ಇನ್ ಮಾಡಿ. ನೀವು ಈ ಖಾತೆಯನ್ನು ಸಹ ತೆಗೆದುಹಾಕಬಹುದು. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="4297219207642690536">ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಮರುಹೊಂದಿಸಿ</translation> @@ -3482,6 +3486,7 @@ <translation id="435527878592612277">ನಿಮ್ಮ ಫೋಟೋ ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="4358302248024731679">ಬ್ಲೂಟೂತ್ ಸಮಸ್ಯೆಗಳನ್ನು ಇನ್ನೂ ಉತ್ತಮವಾಗಿ ಪತ್ತೆಮಾಡಲು, ಗೂಗ್ಲರ್ಗಳು ತಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆ ವರದಿಗಳೊಂದಿಗೆ ಹೆಚ್ಚುವರಿ ಬ್ಲೂಟೂತ್ ಲಾಗ್ಗಳನ್ನು ಸೇರಿಸಿಕೊಳ್ಳಬಹುದು. ಈ ಆಯ್ಕೆಯನ್ನು ಗುರುತಿಸಿದಾಗ, ನಿಮ್ಮ ವರದಿಯು ಸಾಧ್ಯವಾದಷ್ಟು PII ಯನ್ನು ತೆಗೆದುಹಾಕಲು ಸ್ವಚ್ಛಗೊಳಿಸಲಾಗಿರುವ ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಸೆಶನ್ನಿಂದ ಪಡೆಯಲಾದ btsnoop ಮತ್ತು HCI ಲಾಗ್ಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ. ಈ ಲಾಗ್ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು Listnr ನಲ್ಲಿರುವ ChromeOS ಉತ್ಪನ್ನ ಗುಂಪಿನ ನಿರ್ವಾಹಕರಿಗಷ್ಟೇ ಸೀಮಿತಗೊಳಿಸಲಾಗುತ್ತದೆ. ದಾಖಲೆಗಳನ್ನು 90 ದಿನಗಳ ನಂತರ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.</translation> <translation id="4358313196493694334">ಕ್ಲಿಕ್ನ ಸ್ಥಾನವನ್ನು ಸ್ಥಿರಗೊಳಿಸಿ</translation> +<translation id="4358643842961018282">ನಿಮ್ಮ ಸಾಧನ ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ</translation> <translation id="4359408040881008151">ಅವಲಂಬಿತ ವಿಸ್ತರಣೆ(ಗಳು) ಯಿಂದಾಗಿ ಸ್ಥಾಪಿಸಲಾಗಿದೆ.</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">ಈ ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರಕ್ಕೆ ವೈಯಕ್ತಿಕ ಕೀ ಕಾಣೆಯಾಗಿದೆ ಅಥವಾ ಅಮಾನ್ಯವಾಗಿದೆ</translation> @@ -4776,7 +4781,6 @@ <translation id="5658415415603568799">ಹೆಚ್ಚುವರಿ ಸುರಕ್ಷತೆಗಾಗಿ, 20 ಗಂಟೆಗಳ ನಂತರ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ ಎಂದು Smart Lock ನಿಮ್ಮನ್ನು ಕೇಳುತ್ತದೆ.</translation> <translation id="5659593005791499971">ಇಮೇಲ್</translation> <translation id="5659833766619490117">ಈ ಪುಟವನ್ನು ಅನುವಾದಿಸಲಾಗುವುದಿಲ್ಲ</translation> -<translation id="566097169318652001">ನಿಮ್ಮ ಸಾಧನವು ಇನ್ನು ಮುಂದೆ ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು ಮತ್ತು ನೀವು ಭದ್ರತೆ ಮತ್ತು ಕಾರ್ಯಕ್ಷಮತೆಯ ಸಮಸ್ಯೆಗಳನ್ನು ಅನುಭವಿಸಬಹುದು. ನಿಮ್ಮ ಆ್ಯಪ್ಗಳಲ್ಲಿನ ಪ್ರಮುಖ ವೈಶಿಷ್ಟ್ಯಗಳು ಹಳೆಯದಾದಾಗ ಕೆಲಸ ಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಬಹುದು ಮತ್ತು ಕಾನೂನಾತ್ಮಕ ಕ್ಲೈಮ್ಗಳನ್ನು ಮಾಡುವ ನಿಮ್ಮ ಹಕ್ಕನ್ನು ನೀವು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ.</translation> <translation id="5662513737565158057">Linux ಆ್ಯಪ್ಗಳು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸಬೇಕು ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಿ.</translation> <translation id="5667293444945855280">ಮಾಲ್ವೇರ್</translation> <translation id="5667546120811588575">Google Play ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ...</translation> @@ -6097,7 +6101,6 @@ <translation id="697312151395002334">ಪಾಪ್-ಅಪ್ಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ಮರುನಿರ್ದೇಶನಗಳನ್ನು ಬಳಸಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="6973611239564315524">Debian 10 (Buster) ಗೆ ಅಪ್ಗ್ರೇಡ್ ಲಭ್ಯವಿದೆ</translation> <translation id="69739764870135975">Google ಸಹ ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಹುಡುಕಾಟ ಎಂಜಿನ್ ಆಗಿದ್ದರೆ, ನಿಮಗೆ ಉತ್ತಮವಾದ, ಸಾಂದರ್ಭಿಕವಾಗಿ ಸೂಕ್ತವಾದ ಸಲಹೆಗಳು ಕಾಣಿಸುತ್ತವೆ</translation> -<translation id="6974609594866392343">ಆಫ್ಲೈನ್ ಡೆಮೊ ಮೋಡ್</translation> <translation id="697508444536771064">Linux ಅನ್ನು ಶಟ್ ಡೌನ್ ಮಾಡಿ</translation> <translation id="6978121630131642226">ಹುಡುಕಾಟ ಇಂಜಿನ್ಗಳು</translation> <translation id="6979044105893951891">ನಿರ್ವಹಿಸಿದ ಅತಿಥಿ ಸೆಷನ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಅವುಗಳಿಂದ ನಿರ್ಗಮಿಸಿ</translation> @@ -7117,6 +7120,7 @@ <translation id="7981313251711023384">ವೇಗವಾದ ಬ್ರೌಸಿಂಗ್ ಮತ್ತು ಹುಡುಕಾಟಕ್ಕಾಗಿ ಪುಟಗಳನ್ನು ಮುಂಚಿತವಾಗಿ ಲೋಡ್ ಮಾಡಿ</translation> <translation id="798145602633458219"><ph name="SUGGESTION_NAME" /> ಸಲಹೆಯನ್ನು ಹುಡುಕಾಟ ಬಾಕ್ಸ್ನಲ್ಲಿ ನಮೂದಿಸಿ</translation> <translation id="7981662863948574132">ಸಾಧನದ EID ಮತ್ತು QR ಕೋಡ್ ಪಾಪ್ಅಪ್ ಅನ್ನು ತೋರಿಸಿ</translation> +<translation id="7981670705071137488">ಇದರ ನಂತರ, ಸಾಫ್ಟ್ವೇರ್ ಅಪ್ಡೇಟ್ಗಳು ಹಿನ್ನೆಲೆಯನ್ನು ನಡೆಯುತ್ತವೆ. ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅಪ್ಡೇಟ್ ಆದ್ಯತೆಗಳನ್ನು ಪರಿಶೀಲಿಸಬಹುದು.</translation> <translation id="7982083145464587921">ಈ ದೋಷವನ್ನು ಸರಿಪಡಿಸಲು ದಯವಿಟ್ಟು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation> <translation id="7982789257301363584">ನೆಟ್ವರ್ಕ್</translation> <translation id="7984068253310542383"><ph name="DISPLAY_NAME" /> ಅನ್ನು ಪ್ರತಿಬಿಂಬಿಸಿ</translation> @@ -7358,6 +7362,7 @@ <translation id="8214489666383623925">ಫೈಲ್ ತೆರೆಯಿರಿ...</translation> <translation id="8215129063232901118">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ನಿಂದ ನಿಮ್ಮ ಫೋನ್ನ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation> <translation id="8217399928341212914">ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಫೈಲ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡದಂತೆ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸು</translation> +<translation id="822050276545350872">ಈ ಕ್ಷಣದಿಂದ ಕಾಯುವ ಅಗತ್ಯವಿಲ್ಲ</translation> <translation id="8221491193165283816">ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತೀರಿ. ನಿಮಗೆ ಸೂಚನೆ ನೀಡಲು ಈ ಸೈಟ್ಗೆ ಅನುಮತಿಸುವುದಕ್ಕಾಗಿ, ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ.</translation> <translation id="822347941086490485">HID ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ...</translation> <translation id="8225046344534779393">ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 9093baeb..301447c 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">사용자</translation> <translation id="1125550662859510761"><ph name="WIDTH" />x<ph name="HEIGHT" />(기본)처럼 보입니다.</translation> <translation id="1126809382673880764">위험한 웹사이트, 다운로드 항목, 확장 프로그램으로부터 사용자를 보호하지 않습니다. Gmail, Google 검색과 같은 다른 Google 서비스에서는 가능한 경우 세이프 브라우징 보호가 계속 제공됩니다.</translation> +<translation id="1128090040635299943">현재 Linux를 설정하는 중입니다. 설정에는 몇 분 정도 걸릴 수 있습니다.</translation> <translation id="1128591060186966949">검색엔진 수정</translation> <translation id="1129420403709586868">휴대전화의 사진과 미디어를 봅니다.</translation> <translation id="1129850422003387628">앱 관리</translation> @@ -334,6 +335,7 @@ <translation id="1327794256477341646">위치가 필요한 기능이 작동하지 않음</translation> <translation id="1329191040029425999">기기가 최신 상태인지 확인하고 다시 시도해 보세요</translation> <translation id="1330145147221172764">터치 키보드 사용</translation> +<translation id="1331625853030156663"><ph name="APP_NAME" /> 앱을 열려면 ‘절전 모드 해제 시 잠금 화면 표시’를 사용 설정하세요.</translation> <translation id="1331977651797684645">본인이 맞습니다.</translation> <translation id="1333489022424033687">기기에 저장된 다른 사이트의 데이터를 삭제할 때까지 <ph name="ORIGIN" />의 일부 기능을 사용하지 못할 수 있습니다.</translation> <translation id="1333965224356556482">사이트에서 내 위치를 확인하도록 허용하지 않음</translation> @@ -884,6 +886,7 @@ <translation id="1823098433522728610">문서에 민감한 콘텐츠가 있습니다.</translation> <translation id="18245044880483936">백업 데이터는 자녀의 드라이브 스토리지 저장용량에 포함되지 않습니다.</translation> <translation id="1825565032302550710">포트 번호는 1024와 65535 사이여야 합니다.</translation> +<translation id="182577151972096764">최근에 본 레시피</translation> <translation id="1826192255355608658">Chrome 브라우저 북마크, 비밀번호, 방문 기록 등을 동기화</translation> <translation id="1826516787628120939">확인 중</translation> <translation id="1827738518074806965">아트 갤러리</translation> @@ -1318,6 +1321,7 @@ <translation id="2241053333139545397">여러 웹사이트의 데이터를 읽고 변경</translation> <translation id="2241634353105152135">한 번만</translation> <translation id="2242687258748107519">파일 정보</translation> +<translation id="2246129643805925002">최신 기능과 보안 개선사항을 제공하기 위해 <ph name="DEVICE_TYPE" /> 업데이트는 백그라운드에서 자동으로 실행됩니다. 설정에서 업데이트 환경설정을 확인할 수 있습니다.</translation> <translation id="2246549592927364792">Google에서 이미지 설명을 가져올까요?</translation> <translation id="2247738527273549923">조직에서 관리하는 기기입니다</translation> <translation id="2249111429176737533">탭 창으로 열기</translation> @@ -1611,6 +1615,7 @@ <translation id="249113932447298600">죄송합니다. 현재 이 기기(<ph name="DEVICE_LABEL" />)는 지원되지 않습니다.</translation> <translation id="2492461744635776704">인증서 로그인 요청 준비 중</translation> <translation id="2493126929778606526">가장 잘 나온 사진이 자동으로 선별됩니다.</translation> +<translation id="2495524171012645395">최근에 본 레시피</translation> <translation id="2496180316473517155">인터넷 사용 기록</translation> <translation id="2497229222757901769">마우스 속도</translation> <translation id="2497852260688568942">관리자가 동기화를 사용 중지했습니다.</translation> @@ -3342,6 +3347,7 @@ <translation id="420283545744377356">화면 보호기 사용 중지</translation> <translation id="4203065553461038553">파일 이름 또는 위치가 너무 긺</translation> <translation id="4204851595694839599">게임플레이 경험을 알려주세요</translation> +<translation id="4205157409548006256">Linux를 설정하는 중에 오류가 발생했습니다.</translation> <translation id="4206144641569145248">외계인</translation> <translation id="4206323443866416204">의견 보고서</translation> <translation id="4207522141889799150"><ph name="SITE" /> 사이트 권한 수정</translation> @@ -3428,6 +3434,7 @@ <translation id="4289732974614035569">PIN 선택</translation> <translation id="4290791284969893584">페이지를 닫으면 시작한 작업이 완료되지 않을 수 있습니다</translation> <translation id="4291265871880246274">로그인 대화상자</translation> +<translation id="429234155571566255">최근에 본 이 레시피</translation> <translation id="4295072614469448764">단말기에서 앱을 사용할 수 있습니다. 런처에 아이콘이 있을 수도 있습니다.</translation> <translation id="4295979599050707005">웹사이트, 앱, Chrome 확장 프로그램 및 Google Play에서 계정(<ph name="USER_EMAIL" />)을 사용하도록 확인하려면 다시 로그인하세요. 계정을 삭제할 수도 있습니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="4297219207642690536">다시 시작 및 재설정</translation> @@ -3488,6 +3495,7 @@ <translation id="435527878592612277">사진 선택</translation> <translation id="4358302248024731679">블루투스 문제를 더 효과적으로 진단하기 위해 Google 직원이 의견 보고서에 추가 블루투스 로그를 포함할 수 있습니다. 이 옵션을 선택하면 보고서에 현재 세션의 btsnoop 및 HCI 로그가 포함됩니다. 이 로그는 개인 식별 정보가 가능한 한 적게 포함되도록 정리되며, Listnr의 ChromeOS 제품 그룹 관리자만 액세스할 수 있습니다. 해당 로그는 90일 후에 삭제됩니다.</translation> <translation id="4358313196493694334">클릭 위치 보정</translation> +<translation id="4358643842961018282">기기가 최신 상태임</translation> <translation id="4359408040881008151">함께 설치된 확장 프로그램입니다.</translation> <translation id="4359717112757026264">도시 풍경</translation> <translation id="4361142739114356624">이 클라이언트 인증서의 비공개 키가 없거나 잘못되었습니다.</translation> @@ -4781,7 +4789,6 @@ <translation id="5658415415603568799">보안을 강화하기 위해 Smart Lock에서 20시간 후에 비밀번호를 입력하라는 메시지를 표시합니다.</translation> <translation id="5659593005791499971">이메일</translation> <translation id="5659833766619490117">페이지를 번역할 수 없음</translation> -<translation id="566097169318652001">기기가 더 이상 제대로 작동하지 않을 수 있으며 보안 및 성능 문제가 발생할 수 있습니다. 앱이 최신 버전이 아니면 주요 기능이 작동 중지될 수 있으며 사용자가 법적 소송을 제기할 권리를 상실하게 됩니다.</translation> <translation id="5662513737565158057">Linux 앱의 작동방식을 변경합니다.</translation> <translation id="5667293444945855280">악성 코드</translation> <translation id="5667546120811588575">Google Play 설정 중...</translation> @@ -5805,6 +5812,7 @@ <translation id="6686665106869989887">오른쪽으로 탭을 이동함</translation> <translation id="6686817083349815241">비밀번호 저장</translation> <translation id="6687079240787935001"><ph name="MODULE_TITLE" /> 숨기기</translation> +<translation id="6688391094668641513"><ph name="ORIGIN" /> 사이트 읽기 및 변경 요청:</translation> <translation id="6689714331348768690"><ph name="SUPERVISED_USER_NAME" />님을 컴퓨터 앞으로 부르세요. 화면에 표시되는 몇 개의 구문을 읽으면 음성 모델이 생성됩니다. <ph name="BR" /> <ph name="SUPERVISED_USER_NAME" />님이 읽는 데 도움이 필요하다면 먼저 읽어준 후 따라 하라고 하세요. 마이크 멀리서 작게 이야기하여 어시스턴트가 부모님이 아닌 자녀의 음성을 학습하게 하세요.</translation> @@ -6098,7 +6106,6 @@ <translation id="697312151395002334">팝업 전송 및 리디렉션 사용이 허용됨</translation> <translation id="6973611239564315524">Debian 10(Buster)으로 업그레이드할 수 있습니다.</translation> <translation id="69739764870135975">Google이 기본 검색엔진이기도 하면 더 정확하고 관련성 높은 제안을 볼 수 있습니다.</translation> -<translation id="6974609594866392343">오프라인 데모 모드</translation> <translation id="697508444536771064">Linux 종료</translation> <translation id="6978121630131642226">검색엔진</translation> <translation id="6979044105893951891">관리 게스트 세션 실행 및 종료</translation> @@ -6317,6 +6324,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{페이지 나가기}other{페이지 나가기}}</translation> <translation id="7207457272187520234">사용 및 진단 데이터를 보냅니다. 이 기기는 현재 진단, 기기 및 앱 사용 데이터를 Google에 자동으로 보내고 있습니다. 데이터는 시스템 및 앱 안정성 등을 개선하는 데 활용됩니다. 일부 수집 데이터는 Google 앱과 파트너(Android 개발자 등)에게도 도움을 줍니다. 설정은 소유자가 지정합니다. 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 Google 계정에 저장될 수 있습니다.</translation> <translation id="7207631048330366454">앱 검색</translation> +<translation id="720808544705441386">앱을 열 수 없음</translation> <translation id="7210499381659830293">확장 프로그램 프린터</translation> <translation id="7211783048245131419">아직 할당된 스위치가 없음</translation> <translation id="7212097698621322584">PIN을 변경하려면 현재 PIN을 입력하세요. PIN을 모르는 경우 보안 키를 재설정한 다음 새 PIN을 만들어야 합니다.</translation> @@ -7119,6 +7127,7 @@ <translation id="7981313251711023384">더 빠른 인터넷 사용과 검색을 위해 페이지 미리 로드</translation> <translation id="798145602633458219"><ph name="SUGGESTION_NAME" /> 추천 검색어를 검색창에 추가</translation> <translation id="7981662863948574132">기기 EID 및 QR 코드 팝업 표시</translation> +<translation id="7981670705071137488">이후로 소프트웨어 업데이트는 백그라운드에서 실행됩니다. 설정에서 업데이트 환경설정을 확인할 수 있습니다.</translation> <translation id="7982083145464587921">오류를 해결하려면 기기를 다시 시작하세요.</translation> <translation id="7982789257301363584">네트워크</translation> <translation id="7984068253310542383"><ph name="DISPLAY_NAME" /> 미러링</translation> @@ -7363,6 +7372,7 @@ <translation id="8214489666383623925">파일 열기...</translation> <translation id="8215129063232901118"><ph name="DEVICE_TYPE" />에서 휴대전화의 기능에 액세스</translation> <translation id="8217399928341212914">여러 파일을 다운로드하지 못하도록 계속 차단</translation> +<translation id="822050276545350872">이제부터는 기다릴 필요 없습니다</translation> <translation id="8221491193165283816">기본적으로 알림을 차단하는 중입니다. 이 사이트의 알림을 허용하려면 여기를 클릭하세요.</translation> <translation id="822347941086490485">HID 기기를 찾는 중...</translation> <translation id="8225046344534779393">인터넷 연결 상태 확인</translation> @@ -7473,6 +7483,7 @@ <translation id="8324784016256120271">사이트에서 사용자의 다양한 사이트 탐색 활동 정보를 이용해 광고 맞춤설정 등의 작업을 하기 위해 쿠키를 사용할 수 있습니다.</translation> <translation id="8325413836429495820">클립보드 확인이 허용되지 않음</translation> <translation id="8326478304147373412">PKCS #7, 인증서 체인</translation> +<translation id="8327386430364625757">산술 글꼴</translation> <translation id="8327676037044516220">권한 및 콘텐츠 설정</translation> <translation id="8330617762701840933">대체 브라우저로 리디렉션되는 웹사이트의 목록입니다.</translation> <translation id="8330689128072902965">주변 연락처가 나와 파일을 공유할 수 있습니다. 변경하려면 클릭하세요.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 7c18918..d11d30e 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -3185,7 +3185,7 @@ <translation id="4031179711345676612">Микрофонду колдонууга уруксат берилди</translation> <translation id="4031308539321678562">Ушуну менен бул түзмөктөн серептөө дайындары биротоло өчүрүлөт. Бул профилдеги Google аккаунттарын Chromebook түзмөгүңүздөгү башка колдонмолор пайдаланышы мүмкүн. Бул аккаунттарды өчүрүү үчүн <ph name="BEGIN_LINK" /><ph name="SETTING_SECTION" /> > <ph name="ACCOUNTS_SECTION" /><ph name="END_LINK" /> бөлүмүнө өтүңүз.</translation> <translation id="4031527940632463547">Сенсорлорду колдонуу бөгөттөлгөн</translation> -<translation id="4033415645631238123">Мындан ары Smart Lock менен кирүүгө болбойт. Бирок кулпусун Smart Lock. менен ача бересиз.</translation> +<translation id="4033415645631238123">Мындан ары аккаунтуңузга Smart Lock менен кире албайсыз, бирок түзмөктүн кулпусун ача бересиз.</translation> <translation id="4033471457476425443">Жаңы папка кошуу</translation> <translation id="4033963223187371752">Коопсуз сайттар сүрөттөр же веб-алкактар сыяктуу кооптуу мазмунду жалгаштырышы мүмкүн</translation> <translation id="4034824040120875894">Принтер</translation> @@ -4787,7 +4787,6 @@ <translation id="5658415415603568799">Кошумча коопсуздук максатында, Smart Lock 20 сааттан кийин сырсөзүңүздү киргизүүнү талап кылат.</translation> <translation id="5659593005791499971">Электрондук почта</translation> <translation id="5659833766619490117">Бул барак которулбай койду</translation> -<translation id="566097169318652001">Түзмөгүңүз туура иштебей, коопсуздук жана майнаптуулук көйгөйлөрү чыгышы мүмкүн. Эскирип калганда колдонмолоруңуздагы негизги функциялар да иштебей калып, мыйзам талаптарын аткаруу укугунан айрылышыңыз мүмкүн.</translation> <translation id="5662513737565158057">Linux колдонмолору кантип иштерин өзгөртүңүз.</translation> <translation id="5667293444945855280">Кесепеттүү программа</translation> <translation id="5667546120811588575">Google Play жөндөлүүдө…</translation> @@ -5004,7 +5003,7 @@ <translation id="5895138241574237353">Өчүрүп күйгүзүү</translation> <translation id="5895335062901455404">Сакталган параметрлер жана аракеттер Google аккаунтуңуз менен кирген бардык ChromeOS Flex түзмөктөрүндө колдонулат. Эмнени шайкештирүү керек экенин жөндөөлөрдөн тандай аласыз.</translation> <translation id="5896436821193322561">Тыюу салуу</translation> -<translation id="5900186025777217044">Smart Lock жоюлду</translation> +<translation id="5900186025777217044">Smart Lock функциясы өзгөрдү</translation> <translation id="5900302528761731119">Google профиль сүрөтү</translation> <translation id="590036993063074298">Күзгүдөй чагылдыруу сапаты</translation> <translation id="5901069264981746702">Манжа изиңиздин маалыматы <ph name="DEVICE_TYPE" /> түзмөгүңүздө коопсуз сакталат. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> @@ -6106,7 +6105,6 @@ <translation id="697312151395002334">Калкыма терезелерди жөнөтүп, багыттоолорду колдоно алат</translation> <translation id="6973611239564315524">Debian 10 (Buster) версиясы жеткиликтүү</translation> <translation id="69739764870135975">Эгер Google демейки издөө каражатыңыз да болсо, сизге жакшыраак жана ылайыктуу сунуштар көрсөтүлөт</translation> -<translation id="6974609594866392343">Оффлайн демо режими</translation> <translation id="697508444536771064">Linux'ту жабуу</translation> <translation id="6978121630131642226">Издөө каражаттары</translation> <translation id="6979044105893951891">Башкарылган конок сеанстарын иштетүү жана чыгуу</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 043fcd5..0943a3f8 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">ຜູ້ໃຊ້</translation> <translation id="1125550662859510761">ຄວາມລະອຽດ <ph name="WIDTH" /> x <ph name="HEIGHT" /> (ເດີມ)</translation> <translation id="1126809382673880764">ບໍ່ປົກປ້ອງທ່ານຈາກເວັບໄຊ, ການດາວໂຫຼດ ແລະ ສ່ວນຂະຫຍາຍທີ່ເປັນອັນຕະລາຍ. ທ່ານຈະຍັງໄດ້ຮັບການປົກປ້ອງຈາກ Safe Browsing ຢູ່ບ່ອນທີ່ໃຊ້ໄດ້, ຢູ່ໃນການບໍລິການອື່ນຂອງ Google ເຊັ່ນ: Gmail ແລະ ຊອກຫາ.</translation> +<translation id="1128090040635299943">ຕອນນີ້ກຳລັງຕັ້ງຄ່າ Linux ຢູ່. ການຕັ້ງຄ່າຈະໃຊ້ເວລາສອງສາມນາທີ.</translation> <translation id="1128591060186966949">ແກ້ໄຂໂປຣແກຣມຊອກຫາ</translation> <translation id="1129420403709586868">ເບິ່ງຮູບພາບ ແລະ ມີເດຍຂອງໂທລະສັບທ່ານ</translation> <translation id="1129850422003387628">ຈັດການແອັບ</translation> @@ -334,6 +335,7 @@ <translation id="1327794256477341646">ຄຸນສົມບັດທີ່ຕ້ອງການໃຊ້ສະຖານທີ່ຈະໃຊ້ບໍ່ໄດ້</translation> <translation id="1329191040029425999">ກະລຸນາກວດສອບວ່າອຸປະກອນຂອງທ່ານອັບເດດແລ້ວ ແລະ ລອງໃໝ່ອີກເທື່ອໜຶ່ງ</translation> <translation id="1330145147221172764">ເປີດໃຊ້ງານຄີບອດເທິງຫນ້າຈໍ</translation> +<translation id="1331625853030156663">ເພື່ອເປີດ <ph name="APP_NAME" />, ໃຫ້ເປີດການນຳໃຊ້ "ສະແດງໜ້າຈໍລັອກໃນເວລາຕື່ນຈາກການນອນ"</translation> <translation id="1331977651797684645">ນີ້ແມ່ນຂ້ອຍ.</translation> <translation id="1333489022424033687">ບາງຄຸນສົມບັດໃນ <ph name="ORIGIN" /> ອາດຈະບໍ່ເຮັດວຽກຈົນກວ່າວ່າທ່ານລຶບຂໍ້ມູນທີ່ເວັບໄຊອື່ນເກັບໄວ້ໃນອຸປະກອນຂອງທ່ານ</translation> <translation id="1333965224356556482">ບໍ່ອະນຸຍາດໃຫ້ເວັບໄຊເຫັນສະຖານທີ່ຂອງທ່ານ</translation> @@ -882,6 +884,7 @@ <translation id="1823098433522728610">ເອກະສານນີ້ມີເນື້ອຫາລະອຽດອ່ອນ.</translation> <translation id="18245044880483936">ຂໍ້ມູນສຳຮອງຈະບໍ່ນັບຮວມໂຄຕ້າບ່ອນຈັດເກັບຂໍ້ມູນ Drive ຂອງລູກທ່ານ.</translation> <translation id="1825565032302550710">ຜອດຕ້ອງຢູ່ລະຫວ່າງ 1024 ຫາ 65535</translation> +<translation id="182577151972096764">ສູດທີ່ເບິ່ງຫຼ້າສຸດ</translation> <translation id="1826192255355608658">ຊິ້ງຂໍ້ມູນບຸກມາກ, ລະຫັດຜ່ານ, ປະຫວັດ ແລະ ອື່ນໆຂອງ Chrome ທ່ານ</translation> <translation id="1826516787628120939">ກໍາລັງກວດເບິ່ງ</translation> <translation id="1827738518074806965">ຫ້ອງສະແດງງານສິນລະປະ</translation> @@ -1316,6 +1319,7 @@ <translation id="2241053333139545397">ອ່ານ ແລະປ່ຽນແປງຂໍ້ມູນຂອງທ່ານຢູ່ເທິງເວັບໄຊທ໌ຈຳນວນໜຶ່ງ</translation> <translation id="2241634353105152135">ຄັ້ງດຽວເທົ່ານັ້ນ</translation> <translation id="2242687258748107519">ຂໍ້ມູນໄຟລ໌</translation> +<translation id="2246129643805925002"><ph name="DEVICE_TYPE" /> ຂອງທ່ານຈະອັບເດດໃນພື້ນຫຼັງໂດຍອັດຕະໂນມັດເພື່ອມອບຄຸນສົມບັດຫຼ້າສຸດ ແລະ ການປັບປຸງຄວາມປອດໄພໃຫ້ທ່ານ. ທ່ານສາມາດກວດສອບການຕັ້ງຄ່າອັບເດດໄດ້ໃນການຕັ້ງຄ່າ.</translation> <translation id="2246549592927364792">ຮັບລາຍລະອຽດຮູບພາບຈາກ Google ບໍ?</translation> <translation id="2247738527273549923">ອຸປະກອນນີ້ແມ່ນຈັດການໂດຍອົງການຂອງທ່ານ</translation> <translation id="2249111429176737533">ເປີດເປັນໜ້າຈໍແຖບ</translation> @@ -1609,6 +1613,7 @@ <translation id="249113932447298600">ຂໍອະໄພ, ອຸປະກອນ <ph name="DEVICE_LABEL" /> ບໍ່ຮອງຮັບໃນເວລານີ້.</translation> <translation id="2492461744635776704">ກຳລັງກະກຽມຄຳຂໍເຊັນໃບຮັບຮອງ</translation> <translation id="2493126929778606526">ຮູບພາບທີ່ດີສຸດຂອງທ່ານ, ເລືອກໂດຍອັດຕະໂນມັດ</translation> +<translation id="2495524171012645395">ສູດທີ່ເບິ່ງຫຼ້າສຸດ</translation> <translation id="2496180316473517155">ປະຫວັດການທ່ອງເວັບ</translation> <translation id="2497229222757901769">ຄວາມໄວເມົ້າ</translation> <translation id="2497852260688568942">ການຊິ້ງຂໍ້ມູນຖືກປິດນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> @@ -1964,6 +1969,7 @@ <translation id="2832124733806557606">ລູກຂອງທ່ານສາມາດໃຊ້ PIN ເພື່ອເຂົ້າສູ່ລະບົບ ຫຼື ປົດລັອກອຸປະກອນນີ້ໄດ້.</translation> <translation id="2835177225987815960">ລະບົບຈະຣີເຊັດການຕັ້ງຄ່າການສະແກນປັດຈຸບັນຂອງທ່ານ, ຮວມທັງສະວິດໃດກໍຕາມທີ່ໄດ້ຮັບມອບໝາຍ ແລະ ການຕັ້ງຄ່າຄວາມໄວການສະແກນອັດຕະໂນມັດ.</translation> <translation id="2835547721736623118">ການບໍລິການຈຳແນກສຽງເວົ້າ</translation> +<translation id="2836232638504556905">ເພື່ອສືບຕໍ່, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ຈະແບ່ງປັນຊື່, ທີ່ຢູ່ອີເມວ ແລະ ຮູບໂປຣໄຟລ໌ຂອງທ່ານໃຫ້ກັບເວັບໄຊນີ້. ເບິ່ງ <ph name="BEGIN_LINK" />ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ<ph name="END_LINK" /> ຂອງເວັບໄຊນີ້.</translation> <translation id="2836269494620652131">ການຂັດຂ້ອງ</translation> <translation id="2836635946302913370">ການລົງຊື່ເຂົ້າໃຊ້ດ້ວຍຊື່ຜູ້ໃຊ້ນີ້ຖືກປິດໃຊ້ງານໂດຍຜູ້ຄວບຄຸມຂອງທ່ານ.</translation> <translation id="283669119850230892">ເພື່ອໃຊ້ເຄືອຂ່າຍ <ph name="NETWORK_ID" />, ກ່ອນອື່ນໝົດຕ້ອງເຮັດການເຊື່ອມຕໍ່ກັບອິນເຕີເນັດຢູ່ລຸ່ມນີ້.</translation> @@ -2245,6 +2251,7 @@ <translation id="3105796011181310544">ປ່ຽນກັບຄືນເປັນ Google ບໍ?</translation> <translation id="310671807099593501">ເວັບໄຊກຳລັງໃຊ້ bluetooth</translation> <translation id="3108931485517391283">ບໍ່ສາມາດຮັບໄດ້</translation> +<translation id="3109206895301430738">ກຸ່ມແຖບທີ່ບັນທຶກໄວ້</translation> <translation id="3109724472072898302">ຫຍໍ້ລົງ</translation> <translation id="311214366526552035">ຢືນຢັນການດາວໂຫຼດ</translation> <translation id="3112292765614504292">ຂະໜາດແອັບ: <ph name="APP_SIZE" /></translation> @@ -3342,6 +3349,7 @@ <translation id="420283545744377356">ປິດສະກຣີນເຊັບເວີ</translation> <translation id="4203065553461038553">ຊື່ໄຟລ໌ ຫຼື ສະຖານທີ່ຍາວເກີນໄປ</translation> <translation id="4204851595694839599">ປະສົບການໃນການຫຼິ້ນເກມຂອງທ່ານເປັນແນວໃດ?</translation> +<translation id="4205157409548006256">ເກີດຄວາມຜິດພາດໃນຂະນະທີ່ກຳລັງຕັ້ງຄ່າ Linux.</translation> <translation id="4206144641569145248">ມະນຸດຕ່າງດາວ</translation> <translation id="4206323443866416204">ລາຍງານຄຳຕິຊົມ</translation> <translation id="4207522141889799150">ແກ້ໄຂການອະນຸຍາດເວັບໄຊສຳລັບ <ph name="SITE" /></translation> @@ -3428,6 +3436,7 @@ <translation id="4289732974614035569">ເລືອກ PIN</translation> <translation id="4290791284969893584">ຫຼັງຈາກການປິດໜ້າໃດໜຶ່ງ, ໜ້າວຽກທີ່ທ່ານເລີ່ມຕົ້ນໄວ້ອາດບໍ່ແລ້ວ</translation> <translation id="4291265871880246274">ກ່ອງໂຕ້ຕອບການເຂົ້າສູ່ລະບົບ</translation> +<translation id="429234155571566255">ສູດທີ່ເບິ່ງຫຼ້າສຸດເຫຼົ່ານີ້</translation> <translation id="4295072614469448764">ແອັບສາມາດໃຊ້ໄດ້ໃນອຸປະກອນປາຍທາງຂອງທ່ານ, ອາດຈະຍັງມີໄອຄອນໃນຕົວເປີດໃຊ້ຂອງທ່ານນຳອີກ.</translation> <translation id="4295979599050707005">ກະລຸນາເຂົ້າສູ່ລະບົບອີກຄັ້ງເພື່ອຢືນຢັນວ່າບັນຊີຂອງທ່ານ <ph name="USER_EMAIL" /> ສາມາດໃຊ້ໄດ້ກັບເວັບໄຊ, ແອັບ ແລະ ສ່ວນຂະຫຍາຍໃນ Chrome ແລະ Google Play. ທ່ານອາດຈະລຶບບັນຊີນີ້ອອກໄດ້ເຊັ່ນກັນ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="4297219207642690536">ປິດເປີດຄືນໃໝ່ ແລະ ຣິເຊັດ</translation> @@ -3488,6 +3497,7 @@ <translation id="435527878592612277">ເລືອກຮູບພາບຂອງທ່ານ</translation> <translation id="4358302248024731679">ເພື່ອວິນິໄສບັນຫາ Bluetooth ໃຫ້ດີຂຶ້ນ, Googler ສາມາດຮວມເອົາບັນທຶກ Bluetooth ເພີ່ມເຕີມພ້ອມກັບລາຍງານຄຳຕິຊົມຂອງພວກມັນ. ເມື່ອເລືອກຕົວເລືອກນີ້, ລາຍງານຂອງທ່ານຈະຮວມເອົາບັນທຶກ btsnoop ແລະ HCI ຈາກເຊດຊັນປັດຈຸບັນຂອງທ່ານ, ເຊິ່ງຈະທຳຄວາມສະອາດເພື່ອກຳຈັດ PII ອອກໃຫ້ຫຼາຍທີ່ສຸດເທົ່າທີ່ຈະເປັນໄປໄດ້. ສິດເຂົ້າເຖິງບັນທຶກເຫຼົ່ານີ້ຈະຈຳກັດໃຫ້ສະເພາະຜູ້ຈັດການກຸ່ມຜະລິດຕະພັນ ChromeOS ໃນ Listnr ເທົ່ານັ້ນ. ລະບົບຈະລຶບບັນທຶກອອກຢ່າງຖາວອນຫຼັງຈາກ 90 ມື້.</translation> <translation id="4358313196493694334">ປັບໃຫ້ຕຳແໜ່ງການຄລິກຄົງທີ່</translation> +<translation id="4358643842961018282">ອຸປະກອນຂອງທ່ານອັບເດດຫຼ້າສຸດແລ້ວ</translation> <translation id="4359408040881008151">ຕິດຕັ້ງແລ້ວ ເນື່ອງຈາກສ່ວນຂະຫຍາຍທີ່ຂຶ້ນກັບ.</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">ລະຫັດສ່ວນຕົວລັບສຳລັບໃບຮັບຮອງລູກຂ່າຍນີ້ຫາຍໄປ ຫຼື ບໍ່ຖືກຕ້ອງ</translation> @@ -4780,7 +4790,6 @@ <translation id="5658415415603568799">ເພື່ອເພີ່ມຄວາມປອດໄພ, Smart Lock ຈະຮ້ອງຂໍໃຫ້ທ່ານປ້ອນລະຫັດຜ່ານຂອງທ່ານຫຼັງຈາກ 20 ຊົ່ວໂມງ.</translation> <translation id="5659593005791499971">ອີເມວ</translation> <translation id="5659833766619490117">ບໍ່ສາມາດແປໜ້ານີ້ໄດ້</translation> -<translation id="566097169318652001">ອຸປະກອນຂອງທ່ານອາດບໍ່ເຮັດວຽກໄດ້ຕາມປົກກະຕິອີກຕໍ່ໄປ ແລະ ທ່ານອາດພົບບັນຫາຄວາມປອດໄພ ແລະ ປະສິດທິພາບ. ຄຸນສົມບັດຫຼັກໃນແອັບອາດຢຸດເຮັດວຽກເມື່ອພວກມັນເກົ່າແລ້ວ ແລະ ທ່ານຈະເສຍສິດຂອງທ່ານໃນການອ້າງສິດທາງກົດໝາຍ.</translation> <translation id="5662513737565158057">ປ່ຽນວ່າຈະໃຫ້ແອັບ Linux ເຮັດວຽກແນວໃດ.</translation> <translation id="5667293444945855280">ມາລແວ</translation> <translation id="5667546120811588575">ກຳລັງຕັ້ງຄ່າ Google Play...</translation> @@ -5804,6 +5813,7 @@ <translation id="6686665106869989887">ຍ້າຍແຖບໄປເບື້ອງຂວາແລ້ວ</translation> <translation id="6686817083349815241">ບັນທຶກລະຫັດຜ່ານຂອງທ່ານ</translation> <translation id="6687079240787935001">ເຊື່ອງ <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">ກຳລັງຮ້ອງຂໍເພື່ອອ່ານ ແລະ ປ່ຽນ <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">ຂໍ <ph name="SUPERVISED_USER_NAME" /> ໃຫ້ມາເບິ່ງຄອມພິວເຕີ. ລອງຂອງທ່ານຈະຕ້ອງອ່ານກຸ່ມຄຳສອງສາມຢ່າງຢູ່ໜ້າຈໍນີ້ເພື່ອສ້າງຮູບແບບສຽງຂອງເຂົາເຈົ້າ. <ph name="BR" /> ຫາກ <ph name="SUPERVISED_USER_NAME" /> ຕ້ອງການຄວາມຊ່ວຍເຫຼືອໃນການອ່ານ, ໃຫ້ລູກຂອງທ່ານອ່ານຊ້ຳຫຼັງຈາກທ່ານ. ໃຫ້ເວົ້າຄ່ອຍໆຫ່າງຈາກໄມເພື່ອໃຫ້ຜູ້ຊ່ວຍສາມາດຮຽນຮູ້ສຽງຂອງລູກທ່ານແທນທີ່ຈະເປັນສຽງທ່ານ.</translation> @@ -6097,7 +6107,6 @@ <translation id="697312151395002334">ໄດ້ຮັບອະນຸຍາດໃຫ້ສົ່ງປັອບອັບ ແລະ ໃຊ້ການປ່ຽນເສັ້ນທາງ</translation> <translation id="6973611239564315524">ມີການອັບເກຣດເປັນ Debian 10 (Buster)</translation> <translation id="69739764870135975">ຫາກ Google ເປັນໂປຣແກຣມຊອກຫາເລີ່ມຕົ້ນຂອງທ່ານນຳ, ທ່ານຈະເຫັນການແນະນຳທີ່ກ່ຽວຂ້ອງຕາມບໍລິບົດທີ່ດີຂຶ້ນ</translation> -<translation id="6974609594866392343">ໂໝດສາທິດແບບອອບລາຍ</translation> <translation id="697508444536771064">ປິດເຄື່ອງ Linux</translation> <translation id="6978121630131642226">ເຄື່ອງຈັກຄົ້ນຫາ</translation> <translation id="6979044105893951891">ເປີດໃຊ້ ແລະ ອອກຈາກເຊດຊັນແຂກທີ່ມີການຈັດການ</translation> @@ -6316,6 +6325,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{ອອກຈາກໜ້າ}other{ອອກຈາກໜ້າ}}</translation> <translation id="7207457272187520234">ສົ່ງຂໍ້ມູນການນຳໃຊ້ ແລະ ການວິເຄາະ. ອຸປະກອນນີ້ກຳລັງສົ່ງຂໍ້ມູນການວິເຄາະ, ຂໍ້ມູນອຸປະກອນ ແລະ ການໃຊ້ແອັບໃຫ້ Google ໂດຍອັດຕະໂນມັດໃນຂະນະນີ້. ນີ້ຈະຊ່ວຍປັບປຸງຄວາມສະຖຽນຂອງລະບົບ ແລະ ແອັບ ແລະ ການປັບປຸງອື່ນໆ. ບາງຂໍ້ມູນແບບຮວມກັນຍັງຈະຊ່ວຍແອັບ ແລະ ຮຸ້ນສ່ວນຂອງ Google ນຳອີກ ເຊັ່ນ: ຜູ້ພັດທະນາ Android. ເຈົ້າຂອງບັງຄັບໃຊ້ການຕັ້ງຄ່ານີ້. ຖ້າເປີດການຕັ້ງຄ່າການເຄື່ອນໄຫວເວັບ ແລະ ແອັບເພີ່ມເຕີມຂອງທ່ານ, ລະບົບອາດຈະບັນທຶກຂໍ້ມູນນີ້ໄວ້ໃນບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="7207631048330366454">ຊອກຫາແອັບ</translation> +<translation id="720808544705441386">ບໍ່ສາມາດເປີດແອັບໄດ້</translation> <translation id="7210499381659830293">ເຄື່ອງພິມຂອງສ່ວນຂະຫຍາຍ</translation> <translation id="7211783048245131419">ບໍ່ທັນກຳນົດປຸ່ມໃດເທື່ອ</translation> <translation id="7212097698621322584">ປ້ອນ PIN ປັດຈຸບັນຂອງທ່ານເພື່ອປ່ຽນມັນ. ຖ້າທ່ານບໍ່ຮູ້ຈັກ PIN ຂອງທ່ານ, ທ່ານຈະຈໍາເປັນຕ້ອງຣີເຊັດກະແຈຄວາມປອດໄພ, ແລ້ວສ້າງ PIN ໃໝ່.</translation> @@ -7116,6 +7126,7 @@ <translation id="7981313251711023384">ໂຫຼດໜ້າກ່ອນສຳລັບການທ່ອງເວັບ ແລະ ການຊອກຫາທີ່ໄວກວ່າ</translation> <translation id="798145602633458219">ຄັດຕິດການແນະນຳ <ph name="SUGGESTION_NAME" /> ໃສ່ກ່ອງຊອກຫາ</translation> <translation id="7981662863948574132">ສະແດງ EID ອຸປະກອນ ແລະ ປັອບອັບລະຫັດ QR</translation> +<translation id="7981670705071137488">ຫຼັງຈາກນີ້, ການອັບເດດຊອບແວຈະເກີດຂຶ້ນໃນພື້ນຫຼັງ. ທ່ານສາມາດກວດສອບການຕັ້ງຄ່າອັບເດດໄດ້ໃນການຕັ້ງຄ່າ.</translation> <translation id="7982083145464587921">ກະລຸນາປິດເປີດອຸປະກອນຂອງທ່ານຄືນໃໝ່ ເພື່ອແກ້ໄຂຄວາມຜິດພາດນີ້.</translation> <translation id="7982789257301363584">ເຄືອຂ່າຍ</translation> <translation id="7984068253310542383">ສາຍພາບ <ph name="DISPLAY_NAME" /></translation> @@ -7359,6 +7370,7 @@ <translation id="8214489666383623925">ເປີດໄຟລ໌...</translation> <translation id="8215129063232901118">ເຂົ້າເຖິງຄວາມສາມາດຂອງໂທລະສັບຂອງທ່ານຈາກ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ</translation> <translation id="8217399928341212914">ສືບຕໍ່ບລັອກການດາວໂຫຼດຫຼາຍໄຟລ໌ອັດຕະໂນມັດ</translation> +<translation id="822050276545350872">ນັບຈາກນີ້ໄປ, ບໍ່ຈຳເປັນຕ້ອງລໍຖ້າແລ້ວ</translation> <translation id="8221491193165283816">ໂດຍປົກກະຕິແລ້ວທ່ານບລັອກການແຈ້ງເຕືອນ. ເພື່ອອະນຸຍາດໃຫ້ເວັບໄຊນີ້ແຈ້ງເຕືອນທ່ານ, ກະລຸນາຄລິກບ່ອນນີ້.</translation> <translation id="822347941086490485">ກຳລັງຊອກຫາອຸປະກອນ HID...</translation> <translation id="8225046344534779393">ກວດເບິ່ງການເຊື່ອມຕໍ່ອິນເຕີເນັດ</translation> @@ -7469,6 +7481,7 @@ <translation id="8324784016256120271">ເວັບໄຊສາມາດໃຊ້ຄຸກກີ້ເພື່ອເບິ່ງການເຄື່ອນໄຫວທ່ອງເວັບຂອງທ່ານໃນທົ່ວເວັບໄຊຕ່າງໆ ເຊັ່ນ: ເພື່ອປັບແຕ່ງໂຄສະນາໃຫ້ເປັນແບບສ່ວນຕົວ</translation> <translation id="8325413836429495820">ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ເຫັນຄລິບບອດຂອງທ່ານ</translation> <translation id="8326478304147373412">PKCS #7, ຕ່ອງໂສ້ໃບຢັ້ງຢືນ</translation> +<translation id="8327386430364625757">ຟອນກ່ຽວກັບຄະນິດສາດ</translation> <translation id="8327676037044516220">ການອະນຸຍາດ ແລະ ການຕັ້ງຄ່າເນື້ອຫາ</translation> <translation id="8330617762701840933">ລາຍຊື່ຂອງເວັບໄຊທີ່ປ່ຽນເສັ້ນທາງໄປຫາໂປຣແກຣມທ່ອງເວັບສຳຮອງ.</translation> <translation id="8330689128072902965">ລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ຢູ່ໃກ້ຄຽງສາມາດແບ່ງປັນກັບທ່ານໄດ້. ຄລິກເພື່ອປ່ຽນແປງ.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 93d2ea63..ed36a28 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -887,6 +887,7 @@ <translation id="1823098433522728610">Šiame dokumente yra neskelbtino turinio.</translation> <translation id="18245044880483936">Atsarginės kopijos duomenys nebus įtraukti skaičiuojant vaiko Disko saugyklos kvotą.</translation> <translation id="1825565032302550710">Prievadas turi būti nuo 1024 iki 65535</translation> +<translation id="182577151972096764">neseniai peržiūrėtų receptų</translation> <translation id="1826192255355608658">„Chrome“ naršyklės žymių, slaptažodžių, istorijos ir kt. sinchronizavimas</translation> <translation id="1826516787628120939">Tikrinama</translation> <translation id="1827738518074806965">Meno galerija</translation> @@ -1321,6 +1322,7 @@ <translation id="2241053333139545397">Skaityti ir keisti duomenis keliose svetainėse</translation> <translation id="2241634353105152135">Tik vieną kartą</translation> <translation id="2242687258748107519">Failo informacija</translation> +<translation id="2246129643805925002">Jūsų „<ph name="DEVICE_TYPE" />“ atnaujinamas automatiškai fone, kad gautumėte naujausias funkcijas ir saugos patobulinimus. Atnaujinimo nuostatas galite peržiūrėti nustatymuose.</translation> <translation id="2246549592927364792">Gauti vaizdų aprašų iš „Google“?</translation> <translation id="2247738527273549923">Jūsų įrenginį tvarko jūsų organizacija</translation> <translation id="2249111429176737533">Atidaryti kaip į skirtukus suskirstytą langą</translation> @@ -1613,6 +1615,7 @@ <translation id="249113932447298600">Apgailestaujame, tačiau įrenginys <ph name="DEVICE_LABEL" /> šiuo metu nepalaikomas.</translation> <translation id="2492461744635776704">Ruošiama sertifikato pasirašymo užklausa</translation> <translation id="2493126929778606526">Geriausios nuotraukos, parinktos automatiškai</translation> +<translation id="2495524171012645395">Neseniai peržiūrėti receptai</translation> <translation id="2496180316473517155">Naršymo istorija</translation> <translation id="2497229222757901769">Pelės greitis</translation> <translation id="2497852260688568942">Sinchronizavimą išjungė jūsų administratorius</translation> @@ -1968,6 +1971,7 @@ <translation id="2832124733806557606">Vaikas gali prisijungti prie įrenginio arba jį atrakinti PIN kodu.</translation> <translation id="2835177225987815960">Dabartinė nuskaitymo sąranka bus nustatyta iš naujo, įskaitant visus priskirtus jungiklius ir automatinio nuskaitymo spartos nuostatas.</translation> <translation id="2835547721736623118">Kalbos atpažinimo paslauga</translation> +<translation id="2836232638504556905">Kad būtų galima tęsti, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> bendrins jūsų vardą ir pavardę, el. pašto adresą ir profilio nuotrauką su šia svetaine. Žr. šios svetainės <ph name="BEGIN_LINK" />privatumo politiką<ph name="END_LINK" />.</translation> <translation id="2836269494620652131">Strigtis</translation> <translation id="2836635946302913370">Prisijungimas šiuo naudotojo vardu neleidžiamas administratoriaus.</translation> <translation id="283669119850230892">Jei norite naudoti tinklą <ph name="NETWORK_ID" />, pirmiausia baikite prisijungti prie toliau nurodyto interneto.</translation> @@ -2249,6 +2253,7 @@ <translation id="3105796011181310544">Pakeisti atgal į „Google“?</translation> <translation id="310671807099593501">Svetainė naudoja „Bluetooth“</translation> <translation id="3108931485517391283">Nepavyko gauti</translation> +<translation id="3109206895301430738">Išsaugotos skirtukų grupės</translation> <translation id="3109724472072898302">Suskleista</translation> <translation id="311214366526552035">Vis tiek atsisiųsti</translation> <translation id="3112292765614504292">Programos dydis: <ph name="APP_SIZE" /></translation> @@ -3432,6 +3437,7 @@ <translation id="4289732974614035569">Pasirinkite PIN kodą</translation> <translation id="4290791284969893584">Uždarius puslapį, pradėtos užduotys gali likti nebaigtos</translation> <translation id="4291265871880246274">Prisijungimo dialogo langas</translation> +<translation id="429234155571566255">šiuos neseniai peržiūrėtus receptus</translation> <translation id="4295072614469448764">Programa pasiekiama jūsų terminale. Piktograma taip pat gali būti Paleidimo priemonėje.</translation> <translation id="4295979599050707005">Prisijunkite dar kartą, kad patvirtintumėte, jog jūsų paskyrą (<ph name="USER_EMAIL" />) galima naudoti su svetainėmis, programomis ir plėtiniais naršyklėje „Chrome“ ir „Google Play“. Taip pat galite pašalinti šią paskyrą. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Paleisti ir nustatyti iš naujo</translation> @@ -3492,6 +3498,7 @@ <translation id="435527878592612277">Pasirinkite nuotrauką</translation> <translation id="4358302248024731679">Siekdami geriau diagnozuoti „Bluetooth“ problemas, „Google“ darbuotojai gali įtraukti papildomų „Bluetooth“ žurnalų į savo atsiliepimų ataskaitas. Kai ši parinktis pažymėta, į ataskaitą iš dabartinės sesijos bus įtraukti „btsnoop“ ir HCI žurnalai, pašalinus kuo daugiau AII. Pasiekti šiuos žurnalus galės tik „Listnr“ „Chrome“ OS produkto grupės valdytojai. Žurnalai bus panaikinti po 90 dienų.</translation> <translation id="4358313196493694334">Stabilizuoti paspaudimo vietą</translation> +<translation id="4358643842961018282">Įrenginys atnaujintas</translation> <translation id="4359408040881008151">Įdiegta, nes priklauso nuo plėtinio (-ių).</translation> <translation id="4359717112757026264">Miesto architektūra</translation> <translation id="4361142739114356624">Trūksta šio kliento sertifikato privataus rakto arba jis netinkamas</translation> @@ -4786,7 +4793,6 @@ <translation id="5658415415603568799">Kad dar labiau apsaugotumėte įrenginį, „Smart Lock“ prašys įvesti slaptažodį po 20 valandų.</translation> <translation id="5659593005791499971">El. paštas</translation> <translation id="5659833766619490117">Nepavyko išversti šio puslapio</translation> -<translation id="566097169318652001">Jūsų įrenginys gali tinkamai nebeveikti ir galite susidurti su saugos bei našumo problemomis. Pasenusios pagrindinės programų funkcijos taip pat gali nebeveikti, ir prarasite teisę reikšti pretenzijas.</translation> <translation id="5662513737565158057">Keiskite „Linux“ programų veikimą.</translation> <translation id="5667293444945855280">Kenkėjiška programa</translation> <translation id="5667546120811588575">Nustatoma „Google Play“...</translation> @@ -5640,6 +5646,7 @@ <translation id="6520876759015997832"><ph name="LIST_POSITION" /> paieškos rezultatas iš <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Norėdami patekti į skyrių, paspauskite „Enter“.</translation> <translation id="6521214596282732365">Svetainėse paprastai naudojami jūsų šriftai, kad galėtumėte kurti didelio tikslumo turinį internetiniais dizaino ir grafikos įrankiais</translation> <translation id="6523303810310758032">Ištrindami naršymo istoriją (visą ar konkrečios svetainės) taip pat galite ištrinti susijusią vertinimo informaciją. Žr. <ph name="BEGIN_LINK" />naršymo istoriją<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">„Google“ slaptažodžių tvarkyklei nepavyko išsaugoti šių slaptažodžių „Google“ paskyroje. Galite juos išsaugoti šiame įrenginyje.</translation> <translation id="6524735478670290456">Kaip naudojame šiuos duomenis</translation> <translation id="652492607360843641">Esate prisijungę prie šio tinklo: <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Bendrinti</translation> @@ -5950,6 +5957,7 @@ <translation id="6818198425579322765">Verčiama puslapio kalba</translation> <translation id="6818547713623251698">Peržiūrėkite telefono nuotraukas, mediją, pranešimus ir programas</translation> <translation id="6818802132960437751">Integruota apsauga nuo virusų</translation> +<translation id="6818920801736417483">Išsaugoti slaptažodžius?</translation> <translation id="6823174134746916417">Paspaudimas palietus jutiklinę dalį</translation> <translation id="6824564591481349393">Kopijuoti &el. pašto adresą</translation> <translation id="6824584962142919697">&Tikrinti elementus</translation> @@ -6109,7 +6117,6 @@ <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> -<translation id="6974609594866392343">Demonstracinis režimas neprisijungus</translation> <translation id="697508444536771064">Stabdyti „Linux“</translation> <translation id="6978121630131642226">Paieškos sistemos</translation> <translation id="6979044105893951891">Pradėti ir užbaigti valdomas svečio sesijas</translation> @@ -7129,6 +7136,7 @@ <translation id="7981313251711023384">Iš anksto įkelti puslapius, kad naršymo ir paieškos procesai vyktų greičiau</translation> <translation id="798145602633458219">Pridėti pasiūlymą „<ph name="SUGGESTION_NAME" />“ prie paieškos laukelio</translation> <translation id="7981662863948574132">Rodyti įrenginio EID ir QR kodo iššokantįjį langą</translation> +<translation id="7981670705071137488">Po to programinės įrangos naujiniai bus vykdomi fone. Atnaujinimo nuostatas galite peržiūrėti nustatymuose.</translation> <translation id="7982083145464587921">Paleiskite įrenginį iš naujo, kad ištaisytumėte šią klaidą.</translation> <translation id="7982789257301363584">Tinklas</translation> <translation id="7984068253310542383">Rodyti „<ph name="DISPLAY_NAME" />“ vaizdą</translation> @@ -7373,6 +7381,7 @@ <translation id="8214489666383623925">Atidaryti failą...</translation> <translation id="8215129063232901118">Pasiekite savo telefono funkcijas „<ph name="DEVICE_TYPE" />“ įrenginyje</translation> <translation id="8217399928341212914">Toliau blokuoti automatinius kelių failų atsisiuntimus</translation> +<translation id="822050276545350872">Nuo čia nebereikės laukti</translation> <translation id="8221491193165283816">Įprastai blokuojate pranešimus. Jei norite leisti šiai svetainei siųsti pranešimus, spustelėkite čia.</translation> <translation id="822347941086490485">Ieškoma HID įrenginių...</translation> <translation id="8225046344534779393">Patikrinkite interneto ryšį</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index a31cd30..ad63975 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -875,6 +875,7 @@ <translation id="1823098433522728610">Šajā dokumentā ir sensitīvs saturs.</translation> <translation id="18245044880483936">Dublētie dati netiks ieskaitīti jūsu bērna Diska krātuves kvotā.</translation> <translation id="1825565032302550710">Porta numuram jābūt starp 1024 un 65535</translation> +<translation id="182577151972096764">nesen skatītās receptes</translation> <translation id="1826192255355608658">Sinhronizējiet pārlūkā Chrome saglabātās grāmatzīmes, paroles, vēsturi u.c. saturu</translation> <translation id="1826516787628120939">Pārbaude</translation> <translation id="1827738518074806965">Mākslas galerija</translation> @@ -1308,6 +1309,7 @@ <translation id="2241053333139545397">Lasīt un mainīt jūsu datus vairākās vietnēs</translation> <translation id="2241634353105152135">Tikai vienreiz</translation> <translation id="2242687258748107519">Faila informācija</translation> +<translation id="2246129643805925002">Jūsu ierīce (<ph name="DEVICE_TYPE" />) tiek automātiski atjaunināta fonā, lai nodrošinātu jums jaunākās funkcijas un drošības uzlabojumus. Iestatījumos varat pārskatīt atjaunināšanas preferences.</translation> <translation id="2246549592927364792">Vai vēlaties iegūt attēlu aprakstus no Google?</translation> <translation id="2247738527273549923">Šo ierīci pārvalda jūsu organizācija.</translation> <translation id="2249111429176737533">Atvērt kā logu ar cilnēm</translation> @@ -1597,6 +1599,7 @@ <translation id="249113932447298600">Diemžēl ierīce <ph name="DEVICE_LABEL" /> šobrīd netiek atbalstīta.</translation> <translation id="2492461744635776704">Tiek sagatavots sertifikāta parakstīšanas pieprasījums</translation> <translation id="2493126929778606526">Jūsu labākie fotoattēli (atlasīti automātiski)</translation> +<translation id="2495524171012645395">Nesen skatītās receptes</translation> <translation id="2496180316473517155">Pārlūkošanas vēsture</translation> <translation id="2497229222757901769">Peles ātrums</translation> <translation id="2497852260688568942">Administrators ir atspējojis sinhronizēšanu.</translation> @@ -3416,6 +3419,7 @@ <translation id="4289732974614035569">Izvēlieties PIN</translation> <translation id="4290791284969893584">Pēc lapas aizvēršanas var netikt pabeigti jūsu iesāktie uzdevumi</translation> <translation id="4291265871880246274">Pieteikšanās dialoglodziņš</translation> +<translation id="429234155571566255">šīs nesen skatītās receptes</translation> <translation id="4295072614469448764">Lietotne ir pieejama jūsu terminālī. Programmā Palaidējs var būt redzama arī ikona.</translation> <translation id="4295979599050707005">Lūdzu, pierakstieties vēlreiz, lai apstiprinātu, ka tīmekļa vietnes, lietotnes un paplašinājumi pakalpojumos Chrome un Google Play drīkst izmantot jūsu <ph name="USER_EMAIL" /> kontu. Varat arī noņemt šo kontu. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Restartēt un atiestatīt</translation> @@ -3476,6 +3480,7 @@ <translation id="435527878592612277">Atlasiet savu fotoattēlu</translation> <translation id="4358302248024731679">Lai precīzāk noteiktu problēmas ar Bluetooth savienojumu, Google darbinieki atsauksmju ziņojumam var pievienot papildu Bluetooth žurnālus. Ja šī opcija ir atzīmēta, ziņojumā tiks iekļauti pašreizējās sesijas btsnoop un HCI žurnāli, kuros maksimāli noņemta personu identificējoša informācija. Šiem žurnāliem varēs piekļūt tikai Chrome OS produktu grupas pārvaldnieki ierīcē Listnr. Žurnāli tiks dzēsti pēc 90 dienām.</translation> <translation id="4358313196493694334">Stabilizēt klikšķa atrašanās vietu</translation> +<translation id="4358643842961018282">Jūsu ierīce ir atjaunināta</translation> <translation id="4359408040881008151">Paplašinājums tika instalēts atkarīga(-u) paplašinājuma(-u) dēļ.</translation> <translation id="4359717112757026264">Pilsētu fotoattēli</translation> <translation id="4361142739114356624">Nav norādīta šī klienta sertifikāta privātā atslēga, vai tā nav derīga.</translation> @@ -4766,7 +4771,6 @@ <translation id="5658415415603568799">Papildu drošībai Smart Lock lūgs jums ievadīt paroli pēc 20 stundām.</translation> <translation id="5659593005791499971">E-pasts</translation> <translation id="5659833766619490117">Šo lapu nevarēja pārtulkot</translation> -<translation id="566097169318652001">Iespējams, jūsu ierīce vairs nedarbosies pareizi un jūs saskarsieties ar drošības un veiktspējas problēmām. Būtiskas lietotņu funkcijas var pārtraukt darboties, kad tās būs novecojušas, un jūs zaudēsiet tiesības izvirzīt juridiskas prasības.</translation> <translation id="5662513737565158057">Mainiet Linux lietotņu darbības principus.</translation> <translation id="5667293444945855280">Ļaunprātīga programmatūra</translation> <translation id="5667546120811588575">Notiek Google Play iestatīšana...</translation> @@ -6086,7 +6090,6 @@ <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> -<translation id="6974609594866392343">Bezsaistes demonstrācijas režīms</translation> <translation id="697508444536771064">Izslēgt Linux</translation> <translation id="6978121630131642226">Meklētāji</translation> <translation id="6979044105893951891">Palaist un iziet no pārvaldītajām viesu sesijām</translation> @@ -7105,6 +7108,7 @@ <translation id="7981313251711023384">Veikt lapu pirmsielādi, lai paātrinātu pārlūkošanu un meklēšanu</translation> <translation id="798145602633458219">Pievienot ieteikumu <ph name="SUGGESTION_NAME" /> meklēšanas lodziņam</translation> <translation id="7981662863948574132">Rādīt ierīces EID un kvadrātkoda uznirstošo elementu</translation> +<translation id="7981670705071137488">Pēc tam programmatūras atjaunināšana tiks veikta fonā. Iestatījumos varat pārskatīt atjaunināšanas preferences.</translation> <translation id="7982083145464587921">Lai novērstu šo kļūdu, lūdzu, restartējiet ierīci.</translation> <translation id="7982789257301363584">Tīkls</translation> <translation id="7984068253310542383">Spoguļot displeju <ph name="DISPLAY_NAME" /></translation> @@ -7349,6 +7353,7 @@ <translation id="8214489666383623925">Atvērt failu...</translation> <translation id="8215129063232901118">Piekļūstiet tālruņa iespējām no otras ierīces (<ph name="DEVICE_TYPE" />)</translation> <translation id="8217399928341212914">Turpināt bloķēt vairāku failu automātisku lejupielādēšanu</translation> +<translation id="822050276545350872">Turpmāk vairs nebūs jāgaida</translation> <translation id="8221491193165283816">Parasti jūs bloķējat paziņojumus. Lai ļautu šai vietnei sūtīt jums paziņojumus, noklikšķiniet šeit.</translation> <translation id="822347941086490485">Notiek HID ierīču meklēšana...</translation> <translation id="8225046344534779393">Pārbaudiet interneta savienojumu</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 35dc4f34..a0429c0 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">Корисник</translation> <translation id="1125550662859510761">Изгледа како <ph name="WIDTH" /> x <ph name="HEIGHT" /> (матична)</translation> <translation id="1126809382673880764">Не ве заштитува од опасни веб-сајтови, преземања и екстензии. Сѐ уште ќе имате заштита со „Безбедно прелистување“, каде што е достапно, во другите услуги на Google, како Gmail и „Пребарување“.</translation> +<translation id="1128090040635299943">Linux тековно се конфигурира. Конфигурирањето ќе потрае неколку минути.</translation> <translation id="1128591060186966949">Уредете го пребарувачот</translation> <translation id="1129420403709586868">Прегледувајте ги фотографиите и аудиовизуелните содржини од телефонот</translation> <translation id="1129850422003387628">Управување со апликациите</translation> @@ -335,6 +336,7 @@ <translation id="1327794256477341646">Функциите на коишто им треба локацијата нема да работат</translation> <translation id="1329191040029425999">Проверете дали уредот е ажуриран и обидете се повторно</translation> <translation id="1330145147221172764">Овозможи тастатура на екран</translation> +<translation id="1331625853030156663">За да ја отворите <ph name="APP_NAME" />, овозможете „Прикажи заклучен екран при будење од режим на мирување“</translation> <translation id="1331977651797684645">Јас бев.</translation> <translation id="1333489022424033687">Некои функции на <ph name="ORIGIN" /> можеби нема да работат додека не ги избришете податоците што другите сајтови ги складирале на вашиот уред</translation> <translation id="1333965224356556482">Не им дозволувај на сајтовите да ја гледаат локацијата</translation> @@ -3347,6 +3349,7 @@ <translation id="420283545744377356">Исклучете го заштитникот на екранот</translation> <translation id="4203065553461038553">Предолго име на датотека или локација</translation> <translation id="4204851595694839599">Какво беше вашето доживување при играњето?</translation> +<translation id="4205157409548006256">Грешка при конфигурирањето на Linux.</translation> <translation id="4206144641569145248">Вонземјанин</translation> <translation id="4206323443866416204">Извештај за повратни информации</translation> <translation id="4207522141889799150">Изменете ги дозволите за сајтот за <ph name="SITE" /></translation> @@ -4788,7 +4791,6 @@ <translation id="5658415415603568799">За дополнителна безбедност, Smart Lock ќе побара да ја внесете вашата лозинка по 20 часа.</translation> <translation id="5659593005791499971">Е-пошта</translation> <translation id="5659833766619490117">Страницава не може да се преведе</translation> -<translation id="566097169318652001">Можно е уредот да не ви функционира правилно и може да наидете на проблеми со безбедноста и изведбата. И клучните функции во апликацииите може да престанат да функционираат кога ќе застарат и ќе го загубите правото на законско побарување.</translation> <translation id="5662513737565158057">Променете го начинот на работа на апликациите на Linux.</translation> <translation id="5667293444945855280">Злонамерен софтвер</translation> <translation id="5667546120811588575">Се поставува Google Play…</translation> @@ -5815,6 +5817,7 @@ <translation id="6686665106869989887">Картичката е преместена надесно</translation> <translation id="6686817083349815241">Зачувајте ја лозинката</translation> <translation id="6687079240787935001">Сокриј <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">Се бара да се прочита и промени <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">Побарајте од <ph name="SUPERVISED_USER_NAME" /> да дојде до компјутерот. Вашето дете ќе прочита неколку фрази од екранов за да создаде свој гласовен модел. <ph name="BR" /> Ако <ph name="SUPERVISED_USER_NAME" /> има потреба од помош при читањето, тогаш нека повторува после вас. Шепотете подалеку од микрофонот за да може „Помошникот“ да го научи гласот на вашето дете, а не вашиот.</translation> @@ -6109,7 +6112,6 @@ <translation id="697312151395002334">Дозволено им е да испраќаат скокачки програми и да користат пренасочувања</translation> <translation id="6973611239564315524">Достапна е надградба на Debian 10 (Buster)</translation> <translation id="69739764870135975">Ако Google го користите и како стандарден пребарувач, тогаш ќе добивате подобри и контекстуално релевантни предлози</translation> -<translation id="6974609594866392343">Офлајн демо-режим</translation> <translation id="697508444536771064">Исклучи го Linux</translation> <translation id="6978121630131642226">Пребарувачи</translation> <translation id="6979044105893951891">Стартувај ја и излези од надгледуваната гостинска сесија</translation> @@ -6328,6 +6330,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Излези од страницата}one{Излези од страниците}other{Излези од страниците}}</translation> <translation id="7207457272187520234">Испраќајте податоци за користење и дијагностика. Уредов во моментов автоматски испраќа дијагностички и податоци за користењето на уредот и апликациите до Google. Податоциве ќе ни помогнат околу стабилноста на системот и апликациите и за други подобрувања. Некои збирни податоци ќе им помогнат на апликациите и партнерите на Google, како што се програмерите на Android. Поставкава е наметната од сопственикот. Ако сте ја вклучиле дополнителната поставка „Активност на интернет и апликации“, податоциве може да се зачувуваат во вашата сметка на Google.</translation> <translation id="7207631048330366454">Пребарувајте апликации</translation> +<translation id="720808544705441386">Не се отвора апликацијата</translation> <translation id="7210499381659830293">Печатачи за екстензии</translation> <translation id="7211783048245131419">Сѐ уште не е назначен прекинувач</translation> <translation id="7212097698621322584">Внесете го тековниот PIN за да го промените. Ако не го знаете PIN-кодот, ќе треба да го ресетирате безбедносниот клуч, а потоа да создадете нов PIN.</translation> @@ -7487,6 +7490,7 @@ <translation id="8324784016256120271">Сајтовите може да користат колачиња за да ја следат вашата активност од прелистувањето на различни сајтови, на пример, за персонализирање реклами</translation> <translation id="8325413836429495820">Не им е дозволено да ја гледаат привремената меморија</translation> <translation id="8326478304147373412">PKCS #7, ланец на сертификат</translation> +<translation id="8327386430364625757">Математички фонт</translation> <translation id="8327676037044516220">Дозволи и поставки за содржини</translation> <translation id="8330617762701840933">Списокот на веб-сајтови кои пренасочуваат кон алтернативен прелистувач.</translation> <translation id="8330689128072902965">Контактите во близина може да споделуваат со вас. Кликнете за промена.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 93f8c9d..0dee248 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -4769,7 +4769,6 @@ <translation id="5658415415603568799">അധിക സുരക്ഷയ്ക്കായി, 20 മണിക്കൂറിന് ശേഷം നിങ്ങളുടെ പാസ്വേഡ് നൽകാൻ Smart Lock ആവശ്യപ്പെടും.</translation> <translation id="5659593005791499971">ഇമെയില്</translation> <translation id="5659833766619490117">ഈ പേജ് വിവർത്തനം ചെയ്യാനായില്ല</translation> -<translation id="566097169318652001">നിങ്ങളുടെ ഉപകരണം ഇനി ശരിയായി പ്രവർത്തിച്ചേക്കില്ല, സുരക്ഷയും പ്രകടനവുമായി ബന്ധപ്പെട്ട പ്രശ്നങ്ങൾ നിങ്ങൾ നേരിട്ടേക്കാം. നിങ്ങളുടെ ആപ്പുകളിലെ പ്രധാന ഫീച്ചറുകൾ കാലഹരണപ്പെടുന്നതോടെ അവയും പ്രവർത്തനം നിർത്തിയേക്കാം, നിയമപരമായ അവകാശവാദങ്ങൾ ഉന്നയിക്കാനുള്ള നിങ്ങളുടെ അവകാശം നഷ്ടപ്പെടുകയും ചെയ്യും.</translation> <translation id="5662513737565158057">Linux ആപ്പുകളുടെ പ്രവർത്തനരീതി മാറ്റുക.</translation> <translation id="5667293444945855280">ക്ഷുദ്രവെയര്</translation> <translation id="5667546120811588575">Google Play സജ്ജമാക്കുന്നു...</translation> @@ -6090,7 +6089,6 @@ <translation id="697312151395002334">പോപ്പ് അപ്പ് അയയ്ക്കുന്നതും റീഡയറക്റ്റുകൾ ഉപയോഗിക്കുന്നതും അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="6973611239564315524">Debian 10 (Buster) -ലേക്കുള്ള അപ്ഗ്രേഡ് ലഭ്യമാണ്</translation> <translation id="69739764870135975">Google നിങ്ങളുടെ ഡിഫോൾട്ട് തിരയൽ യന്ത്രം കൂടിയാണെങ്കിൽ, മികച്ചതും സന്ദർഭോചിതവുമായ നിർദ്ദേശങ്ങൾ നിങ്ങൾ കാണും</translation> -<translation id="6974609594866392343">ഓഫ്ലൈൻ ഡെമോ മോഡ്</translation> <translation id="697508444536771064">Linux ഷട്ട് ഡൗൺ ചെയ്യുക</translation> <translation id="6978121630131642226">തിരയൽ യന്ത്രങ്ങൾ</translation> <translation id="6979044105893951891">ആരംഭിക്കലും പുറത്തുകടക്കലും മാനേജ് ചെയ്ത അതിഥി സെഷനുകൾ</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 97575a3..7d7a710 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">Хэрэглэгч</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> юм шиг харагдаж байна (Үндсэн)</translation> <translation id="1126809382673880764">Таныг аюултай вебсайт, таталт болон өргөтгөлөөс хамгаалахгүй. Гэхдээ та Аюулгүй үзэх хамгаалалтыг Gmail, Хайлт зэрэг Google-н боломжтой бусад үйлчилгээнд авсан хэвээр байна.</translation> +<translation id="1128090040635299943">Linux-г одоогоор тохируулж байна. Тохируулахад хэдэн минут шаардлагатай.</translation> <translation id="1128591060186966949">Хайлтын системийг засах</translation> <translation id="1129420403709586868">Утасныхаа зураг болон медиаг хараарай</translation> <translation id="1129850422003387628">Аппуудыг удирдах</translation> @@ -334,6 +335,7 @@ <translation id="1327794256477341646">Таны байршил шаардлагатай онцлогууд ажиллахгүй</translation> <translation id="1329191040029425999">Таны төхөөрөмж хамгийн шинэ эсэхийг шалгаад, дахин оролдоно уу</translation> <translation id="1330145147221172764">Дэлгэц дээрх гарыг идэвхжүүлэх</translation> +<translation id="1331625853030156663"><ph name="APP_NAME" />-г нээхийн тулд "Идэвхгүй байдлаас сэрэх үед түгжигдсэн дэлгэц харуулах"-ыг идэвхжүүлнэ үү</translation> <translation id="1331977651797684645">Би байсан.</translation> <translation id="1333489022424033687">Таны төхөөрөмж дээр бусад сайтын хадгалсан өгөгдлийг та устгах хүртэл <ph name="ORIGIN" /> дээрх зарим онцлог ажиллахгүй байж болзошгүй</translation> <translation id="1333965224356556482">Сайтуудад таны байршлыг харахыг бүү зөвшөөр</translation> @@ -1964,6 +1966,7 @@ <translation id="2832124733806557606">Таны хүүхэд төхөөрөмжид нэвтрэх эсвэл түгжээг тайлахын тулд ПИН ашиглах боломжтой.</translation> <translation id="2835177225987815960">Таны оноосон аливаа сэлгүүр болон автоматаар скан хийх хурдны тохиргоог оруулаад одоогийн скан хийх тохируулгыг шинэчилнэ.</translation> <translation id="2835547721736623118">Яриа таних үйлчилгээ</translation> +<translation id="2836232638504556905">Үргэлжүүлэхийн тулд <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> таны нэр, имэйл хаяг болон профайл зургийг энэ сайттай хуваалцана. Энэ сайтын <ph name="BEGIN_LINK" />нууцлалын бодлого<ph name="END_LINK" />-г харна уу.</translation> <translation id="2836269494620652131">Эвдрэл</translation> <translation id="2836635946302913370">Энэ хэрэглэгчийн нэрээр нэвтрэхийг администратор хориглосон байна.</translation> <translation id="283669119850230892">Сүлжээг ашиглахын тулд <ph name="NETWORK_ID" /> эхлээд доорх Интернэтийн холболтыг дуусгана уу.</translation> @@ -2245,6 +2248,7 @@ <translation id="3105796011181310544">Google рүү буцааж өөрчлөх үү?</translation> <translation id="310671807099593501">Сайт bluetooth-г ашиглаж байна</translation> <translation id="3108931485517391283">Хүлээн авах боломжгүй</translation> +<translation id="3109206895301430738">Хадгалсан табын бүлгүүд</translation> <translation id="3109724472072898302">Задарсан</translation> <translation id="311214366526552035">Ямартай ч татах</translation> <translation id="3112292765614504292">Аппын хэмжээ: <ph name="APP_SIZE" /></translation> @@ -3341,6 +3345,7 @@ <translation id="420283545744377356">Дэлгэц амраагчийг унтраах</translation> <translation id="4203065553461038553">Файлын нэр эсвэл байршил хэт урт байна</translation> <translation id="4204851595694839599">Таны тоглоомын туршлага ямар байсан бэ?</translation> +<translation id="4205157409548006256">Linux-г тохируулах явцад алдаа гарлаа.</translation> <translation id="4206144641569145248">Харь гарагийн хүн</translation> <translation id="4206323443866416204">Санал хүсэлтийн тайлан</translation> <translation id="4207522141889799150"><ph name="SITE" />-н сайтын зөвшөөрлийг засах</translation> @@ -4783,7 +4788,6 @@ <translation id="5658415415603568799">Таны аюулгүй байдлыг сайжруулахын тулд Smart Lock 20 цагийн дараа таныг нууц үгээ оруулахыг шаардах болно.</translation> <translation id="5659593005791499971">И-мэйл хаяг</translation> <translation id="5659833766619490117">Энэ хуудсыг орчуулж чадсангүй</translation> -<translation id="566097169318652001">Таны төхөөрөмж цаашид зохих ёсоор ажиллахгүй байж магадгүй бөгөөд та аюулгүй байдал болон гүйцэтгэлийн асуудалтай тулгарч магадгүй. Таны аппуудын гол онцлогууд хуучирсан тохиолдолд мөн ажиллахаа болих бөгөөд та хууль эрх зүйн нэхэмжлэл гаргах эрхээ алдана.</translation> <translation id="5662513737565158057">Linux аппууд хэрхэн ажиллахыг өөрчилнө үү.</translation> <translation id="5667293444945855280">Хорт вирус</translation> <translation id="5667546120811588575">Google Play-г тохируулж байна...</translation> @@ -5636,6 +5640,7 @@ <translation id="6520876759015997832"><ph name="LIST_SIZE" />-н <ph name="LIST_POSITION" /> дахь хайлтын илэрц: <ph name="SEARCH_RESULT_TEXT" />. Хэсэг рүү шилжихийн тулд Enter дээр дарна уу.</translation> <translation id="6521214596282732365">Сайтууд ихэвчлэн таны фонтыг ашигладаг бөгөөд ингэснээр та онлайн дизайн болон диаграммын хэрэгслээр өндөр нарийвчлалтай контент үүсгэх боломжтой</translation> <translation id="6523303810310758032">Та бүх эсвэл тодорхой сайтын — хөтчийн түүхээ устгах үед — холбоотой хэмжилтийн мэдээллийг мөн устгана. <ph name="BEGIN_LINK" />Хөтчийн түүхээ<ph name="END_LINK" /> харна уу</translation> +<translation id="6523574494641144162">Google Password Manager эдгээрийг таны Google Бүртгэл дээр хадгалж чадсангүй. Та энэ төхөөрөмж дээр тэдгээрийг хадгалах боломжтой.</translation> <translation id="6524735478670290456">Бид энэ өгөгдлийг хэрхэн ашиглах вэ?:</translation> <translation id="652492607360843641">Та <ph name="NETWORK_TYPE" /> сүлжээнд холбогдсон байна.</translation> <translation id="6527303717912515753">Хуваалцах</translation> @@ -5806,6 +5811,7 @@ <translation id="6686665106869989887">Табыг баруун тийш зөөсөн</translation> <translation id="6686817083349815241">Нууц үгээ хадгална уу</translation> <translation id="6687079240787935001"><ph name="MODULE_TITLE" />-г нуух</translation> +<translation id="6688391094668641513"><ph name="ORIGIN" />-г уншиж, өөрчлөх хүсэлт тавьж байна:</translation> <translation id="6689714331348768690"><ph name="SUPERVISED_USER_NAME" />-г компьютерын урд ирэхийг хүснэ үү. Таны хүүхэд дуу хоолойн загвараа үүсгэхийн тулд энэ дэлгэц дээр цөөн хэллэг унших шаардлагатай. <ph name="BR" /> Хэрэв <ph name="SUPERVISED_USER_NAME" />-д уншихад нь тусламж хэрэгтэй бол түүнийг өөрийнхөө араас давтуулж хэлүүлээрэй. Микрофоноосоо зайтай шивнэснээр Туслах таны оронд хүүхдийн тань дуу хоолойг сурна.</translation> @@ -5940,6 +5946,7 @@ <translation id="6818198425579322765">Хуудсыг орчуулах хэл</translation> <translation id="6818547713623251698">Утасныхаа зураг, медиа, мэдэгдлүүд болон аппуудыг хараарай</translation> <translation id="6818802132960437751">Суурилуулсан вирусний хамгаалалт</translation> +<translation id="6818920801736417483">Нууц үгийг хадгалах уу?</translation> <translation id="6823174134746916417">Мэдрэгч самбарын tap-to-click</translation> <translation id="6824564591481349393">Хуулах & И-мэйл хаяг</translation> <translation id="6824584962142919697">&Элементүүдийг шалгах</translation> @@ -6099,7 +6106,6 @@ <translation id="697312151395002334">Попап илгээх болон дахин чиглүүлэлт ашиглахыг зөвшөөрсөн</translation> <translation id="6973611239564315524">Debian 10 (Buster) руу дэвшүүлэх боломжтой байна</translation> <translation id="69739764870135975">Хэрэв Google нь таны өгөгдмөл хайлтын систем бол та хам сэдэвтэй холбоотой илүү сайн зөвлөмжүүдийг харах болно</translation> -<translation id="6974609594866392343">Офлайн туршилтын горим</translation> <translation id="697508444536771064">Linux-г унтраах</translation> <translation id="6978121630131642226">Хайлтын систем</translation> <translation id="6979044105893951891">Эхлүүлээд, удирдлагатай зочны сургалтаас гарах</translation> @@ -6318,6 +6324,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Хуудаснаас гарах}other{Хуудаснуудаас гарах}}</translation> <translation id="7207457272187520234">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Хэрэв таны Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation> <translation id="7207631048330366454">Аппууд хайх</translation> +<translation id="720808544705441386">Аппыг нээх боломжгүй</translation> <translation id="7210499381659830293">Өргөтгөлийн хэвлэгч</translation> <translation id="7211783048245131419">Одоохондоо оноосон сэлгэгч алга</translation> <translation id="7212097698621322584">ПИН-г өөрчлөхийн тулд одоогийн ПИН-ээ оруулна уу. Хэрэв та ПИН-ээ мэдэхгүй бол аюулгүй байдлын түлхүүрээ шинэчлээд дараа нь шинэ ПИН үүсгэх шаардлагатай.</translation> @@ -7472,6 +7479,7 @@ <translation id="8324784016256120271">Сайтууд нь, жишээлбэл зарыг хувийн болгохын тулд өөр өөр сайт дээрх таны хөтчийн үйл ажиллагааг харахын тулд күүки ашиглах боломжтой</translation> <translation id="8325413836429495820">Таны түр санах ойг харахыг зөвшөөрөөгүй</translation> <translation id="8326478304147373412">PKCS # 7, сертификат хэлхээ</translation> +<translation id="8327386430364625757">Математикийн фонт</translation> <translation id="8327676037044516220">Зөвшөөрөл болон контентын тохиргоо</translation> <translation id="8330617762701840933">Хоёрдогч хөтөч рүү дахин чиглүүлэх вебсайтын жагсаалт.</translation> <translation id="8330689128072902965">Ойролцоох харилцагчид тантай хуваалцах боломжтой. Өөрчлөхийн тулд товшино уу.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index ebf11de..f09a5143 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -4784,7 +4784,6 @@ <translation id="5658415415603568799">अतिरिक्त सुरक्षिततेसाठी Smart Lock तुम्हाला २० तासांनंतर पासवर्ड एंटर करण्यास सांगेल.</translation> <translation id="5659593005791499971">ई-मेल</translation> <translation id="5659833766619490117">या पेजचे भाषांतर करता आले नाही</translation> -<translation id="566097169318652001">तुमचे डिव्हाइस यापुढे कदाचित योग्यरीत्या काम करणार नाही आणि तुम्हाला सुरक्षा व परफॉर्मन्सशी संबंधित समस्या येऊ शकतात. तुमच्या अॅप्समधील महत्त्वाची वैशिष्ट्ये कालबाह्य झाल्यावर ती काम करणे बंद करू शकतात आणि तुम्ही कायदेशीर दावे करण्याचा तुमचा अधिकार गमवाल.</translation> <translation id="5662513737565158057">Linux ॲप्स कशी काम करतील ते बदला.</translation> <translation id="5667293444945855280">मालवेअर</translation> <translation id="5667546120811588575">Google Play सेट अप करत आहे...</translation> @@ -6104,7 +6103,6 @@ <translation id="697312151395002334">पॉप-अप पाठवण्याची आणि रीडिरेक्ट वापरण्याची अनुमती आहे</translation> <translation id="6973611239564315524">Debian 10 (Buster) साठी अपग्रेड उपलब्ध आहे</translation> <translation id="69739764870135975">Google देखील तुमचे डीफॉल्ट शोध इंजीन असल्यास, तुम्हाला आणखी चांगल्या, संदर्भानुसार उपयुक्त सूचना दिसतील</translation> -<translation id="6974609594866392343">ऑफलाइन डेमो मोड</translation> <translation id="697508444536771064">Linux बंद करा</translation> <translation id="6978121630131642226">शोध इंजिने</translation> <translation id="6979044105893951891">लाँच करा आणि व्यवस्थापित केलेल्या अतिथी सत्रांमधून बाहेर पडा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index d54aa1c8..7dc40b5 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -4787,7 +4787,6 @@ <translation id="5658415415603568799">Untuk keselamatan tambahan, Smart Lock akan meminta anda memasukkan kata laluan selepas 20 jam.</translation> <translation id="5659593005791499971">E-mel</translation> <translation id="5659833766619490117">Halaman ini tidak dapat diterjemahkan</translation> -<translation id="566097169318652001">Peranti anda mungkin tidak lagi berfungsi dengan betul dan anda mungkin mengalami masalah keselamatan dan prestasi. Ciri utama dalam apl anda juga mungkin berhenti berfungsi apabila sudah lapuk dan anda akan kehilangan hak anda untuk membuat tuntutan undang-undang.</translation> <translation id="5662513737565158057">Tukar cara apl Linux berfungsi.</translation> <translation id="5667293444945855280">Perisian Berniat Jahat</translation> <translation id="5667546120811588575">Menyediakan Google Play...</translation> @@ -6104,7 +6103,6 @@ <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> -<translation id="6974609594866392343">Mod tunjuk cara luar talian</translation> <translation id="697508444536771064">Matikan Linux</translation> <translation id="6978121630131642226">Enjin Carian</translation> <translation id="6979044105893951891">Lancarkan dan keluar daripada sesi tetamu yang diurus</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 891d2eb..44da3f7 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -4785,7 +4785,6 @@ <translation id="5658415415603568799">လုံခြုံရေး ပိုမိုကောင်းမွန်စေရန်အတွက် နာရီ ၂၀ ကြာပြီးသည့်နောက် Smart Lock သည် သင့်ကို စကားဝှက် ထပ်မံထည့်သွင်းခိုင်းမည်ဖြစ်သည်။</translation> <translation id="5659593005791499971">အီးမေးလ်</translation> <translation id="5659833766619490117">ဤစာမျက်နှာကို ဘာသာပြန်၍ မရပါ</translation> -<translation id="566097169318652001">သင့်စက်ပစ္စည်း မှန်ကန်စွာ အလုပ်မလုပ်တော့ဘဲ လုံခြုံရေးနှင့် စွမ်းဆောင်မှုပြဿနာများ ကြုံတွေ့ရနိုင်သည်။ သင့်အက်ပ်များဟောင်းသွားပါက ၎င်းတို့ရှိ အဓိကဝန်ဆောင်မှုများလည်း ရပ်သွားနိုင်ပြီး ဥပဒေနှင့်အညီ တောင်းဆိုမှုများပြုလုပ်ခွင့် ဆုံးရှုံးနိုင်သည်။</translation> <translation id="5662513737565158057">Linux အက်ပ်များ အလုပ်လုပ်ပုံကို ပြောင်းရန်။</translation> <translation id="5667293444945855280">အန္တရာယ်ဝဲ</translation> <translation id="5667546120811588575">Google Play ကို စနစ်ထည့်သွင်းနေသည်...</translation> @@ -6101,7 +6100,6 @@ <translation id="697312151395002334">ပေါ့ပ်အပ်များပို့ရန်နှင့် တစ်ဆင့်ပြန်ညွှန်ပြရန် ခွင့်ပြုထားသည်</translation> <translation id="6973611239564315524">Debian 10 (Buster) သို့ အဆင့်မြှင့်တင်နိုင်ပါပြီ</translation> <translation id="69739764870135975">Google သည် သင်၏မူရင်းရှာဖွေရေး အင်ဂျင်လည်းဖြစ်ပါက အကြောင်းအရာ အပေါ်မူတည်သည့် ပိုကောင်းမွန်သော သက်ဆိုင်ရာအကြံပြုချက်များကို မြင်ရပါမည်</translation> -<translation id="6974609594866392343">အော့ဖ်လိုင်း သရုပ်ပြမုဒ်</translation> <translation id="697508444536771064">Linux ကို အပြီးပိတ်ရန်</translation> <translation id="6978121630131642226">ရှာဖွေရေး အင်ဂျင်များ</translation> <translation id="6979044105893951891">စီမံခန့်ခွဲထားသည့် ဧည့်သည်စက်ရှင်များကို ဖွင့်ခြင်းနှင့် ပိတ်ခြင်း</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 9a01d91..6a529c03 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -4768,7 +4768,6 @@ <translation id="5658415415603568799">अतिरिक्त सुरक्षाका खातिर Smart Lock ले तपाईंलाई २० घन्टापछि आफ्नो पासवर्ड प्रविष्ट गर्न लगाउन सक्छ।</translation> <translation id="5659593005791499971">इमेल</translation> <translation id="5659833766619490117">यस पृष्ठलाई अनुवाद गर्न सकिएन</translation> -<translation id="566097169318652001">तपाईंको डिभाइसले राम्रोसँग काम गर्न छाड्न सक्छ र सुरक्षा तथा पर्फर्मेन्ससम्बन्धी समस्या आउन सक्छ। तपाईंका एपहरू पुरानो भएपछि ती एपमा उपलब्ध मुख्य सुविधाहरूले पनि काम गर्न छाड्न सक्छन् र तपाईं कानुनी दाबी गर्ने आफ्नो अधिकार गुमाउनु हुने छ।</translation> <translation id="5662513737565158057">Linux एपहरूले काम गर्ने तरिका परिवर्तन गर्नुहोस्।</translation> <translation id="5667293444945855280">मालवेयर</translation> <translation id="5667546120811588575">Google Play सेटअप गरिँदै छ…</translation> @@ -6086,7 +6085,6 @@ <translation id="697312151395002334">पप-अपहरू पठाउन र रिडिरेक्टहरू प्रयोग गर्ने अनुमति दिइएका साइटहरू</translation> <translation id="6973611239564315524">Debian 10 (Buster) मा स्तरोन्नति गर्ने सुविधा उपलब्ध छ</translation> <translation id="69739764870135975">तपाईंको डिफल्ट सर्च इन्जिन Google नै हो भने तपाईं अझ उपयुक्त र सान्दर्भिक सुझावहरू देख्नु हुने छ</translation> -<translation id="6974609594866392343">अफलाइन डेमो मोड</translation> <translation id="697508444536771064">Linux बन्द गर्नुहोस्</translation> <translation id="6978121630131642226">खोज इन्जिनहरू</translation> <translation id="6979044105893951891">अतिथिका व्यवस्थित सत्रहरू सुरु गर्ने तथा सोबाट बाहिर निस्कने</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index de560340..cfd5bf8 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -4766,7 +4766,6 @@ <translation id="5658415415603568799">Voor extra beveiliging vraagt Smart Lock je na 20 uur je wachtwoord op te geven.</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5659833766619490117">Deze pagina kan niet worden vertaald</translation> -<translation id="566097169318652001">Je apparaat werkt misschien niet meer goed en je kunt beveiligings- en prestatieproblemen ondervinden. Belangrijke functies in je apps werken misschien ook niet meer als ze verouderd raken. Je raakt dan je recht op juridische eisen kwijt.</translation> <translation id="5662513737565158057">Wijzigen hoe Linux-apps werken.</translation> <translation id="5667293444945855280">Malware</translation> <translation id="5667546120811588575">Google Play instellen...</translation> @@ -5618,6 +5617,7 @@ <translation id="6520876759015997832">Zoekresultaat <ph name="LIST_POSITION" /> van <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Druk op Enter om naar de sectie te navigeren.</translation> <translation id="6521214596282732365">Sites gebruiken je lettertypen meestal om te zorgen dat je hoogwaardige content kunt maken met online ontwerp- en grafische tools</translation> <translation id="6523303810310758032">Als je je browsegeschiedenis verwijdert (alles of alleen de geschiedenis voor een specifieke site), verwijder je ook de hieraan gekoppelde metingsgegevens. Bekijk <ph name="BEGIN_LINK" />je browsegeschiedenis<ph name="END_LINK" />.</translation> +<translation id="6523574494641144162">Google Wachtwoordmanager kan deze wachtwoorden niet opslaan in je Google-account. Je kunt ze op dit apparaat opslaan.</translation> <translation id="6524735478670290456">Hoe we deze gegevens gebruiken:</translation> <translation id="652492607360843641">Je hebt verbinding met een <ph name="NETWORK_TYPE" /> netwerk.</translation> <translation id="6527303717912515753">Delen</translation> @@ -5922,6 +5922,7 @@ <translation id="6818198425579322765">Paginataal om te vertalen</translation> <translation id="6818547713623251698">Foto's, media, meldingen en apps van je telefoon bekijken</translation> <translation id="6818802132960437751">Ingebouwde virusbeveiliging</translation> +<translation id="6818920801736417483">Wachtwoorden opslaan?</translation> <translation id="6823174134746916417">Tikken-om-te-klikken voor touchpad</translation> <translation id="6824564591481349393">&E-mailadres kopiëren</translation> <translation id="6824584962142919697">Elementen &inspecteren</translation> @@ -6081,7 +6082,6 @@ <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> -<translation id="6974609594866392343">Offline demomodus</translation> <translation id="697508444536771064">Linux afsluiten</translation> <translation id="6978121630131642226">Zoekmachines</translation> <translation id="6979044105893951891">Beheerde gastsessies starten en beëindigen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index ebb1abc..d4158f78 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -4777,7 +4777,6 @@ <translation id="5658415415603568799">For å beskytte deg bedre ber Smart Lock deg om å skrive inn passordet ditt etter 20 timer.</translation> <translation id="5659593005791499971">E-post</translation> <translation id="5659833766619490117">Siden kunne ikke oversettes</translation> -<translation id="566097169318652001">Det kan hende at enheten din slutter å fungere som den skal, og du kan oppleve sikkerhets- og ytelsesproblemer. Viktige funksjoner i appene dine kan også slutte å fungere når de blir utdatert, og du mister retten til å fremsette juridiske krav.</translation> <translation id="5662513737565158057">Endre måten Linux-apper fungerer på.</translation> <translation id="5667293444945855280">Skadelig programvare</translation> <translation id="5667546120811588575">Konfigurerer Google Play …</translation> @@ -6096,7 +6095,6 @@ <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> -<translation id="6974609594866392343">Demomodus uten nett</translation> <translation id="697508444536771064">Avslutt Linux</translation> <translation id="6978121630131642226">Søkemotorer</translation> <translation id="6979044105893951891">starte og avslutte administrerte gjesteøkter</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 04f487ae..3e9d5650 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -870,6 +870,7 @@ <translation id="1823098433522728610">ଏହି ଡକ୍ୟୁମେଣ୍ଟରେ ସମ୍ବେଦନଶୀଳ ବିଷୟବସ୍ତୁ ଅଛି।</translation> <translation id="18245044880483936">ବ୍ୟାକଅପ୍ ଡାଟାକୁ ଆପଣଙ୍କ ପିଲାର Drive ଷ୍ଟୋରେଜ୍ କୋଟାରେ ଗଣନା କରାଯିବ ନାହିଁ।</translation> <translation id="1825565032302550710">ପୋର୍ଟ 1024 ଓ 65535 ମଧ୍ୟରେ ହେବା ଆବଶ୍ୟକ</translation> +<translation id="182577151972096764">ବର୍ତ୍ତମାନ ଦେଖାଯାଇଥିବା ରେସିପିଗୁଡ଼ିକ</translation> <translation id="1826192255355608658">ଆପଣଙ୍କ Chrome ବ୍ରାଉଜରରେ ବୁକମାର୍କ, ପାସୱାର୍ଡ, ଇତିହାସ ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ସିଙ୍କ୍ କରନ୍ତୁ</translation> <translation id="1826516787628120939">ଯାଞ୍ଚ ହେଉଛି</translation> <translation id="1827738518074806965">ଆର୍ଟ ଗ୍ୟାଲେରୀ</translation> @@ -1303,6 +1304,7 @@ <translation id="2241053333139545397">ଅନେକଗୁଡ଼ିଏ ୱେବ୍ସାଇଟ୍ରେ ଆପଣଙ୍କର ଡାଟା ପଢ଼ନ୍ତୁ ଏବଂ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation> <translation id="2241634353105152135">ଥରେ ମାତ୍ର</translation> <translation id="2242687258748107519">ଫାଇଲ୍ ସୂଚନା</translation> +<translation id="2246129643805925002">ଆପଣଙ୍କୁ ନବୀନତମ ଫିଚର ଏବଂ ସୁରକ୍ଷା ଉନ୍ନତି ଦେବା ପାଇଁ ଆପଣଙ୍କ <ph name="DEVICE_TYPE" /> ପୃଷ୍ଠପଟରେ ସ୍ୱଚାଳିତ ଭାବେ ଅପଡେଟ ହୁଏ। ଆପଣ ସେଟିଂସରେ ଅପଡେଟ ପସନ୍ଦଗୁଡ଼ିକୁ ସମୀକ୍ଷା କରିପାରିବେ।</translation> <translation id="2246549592927364792">Googleରୁ ଛବିର ବର୍ଣ୍ଣନା ପ୍ରାପ୍ତ କରିବେ?</translation> <translation id="2247738527273549923">ଆପଣଙ୍କ ଡିଭାଇସ୍ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି</translation> <translation id="2249111429176737533">ଟାବ୍ କରାଯାଇଥିବା ୱିଣ୍ଡୋ ଭାବରେ ଖୋଲନ୍ତୁ</translation> @@ -1593,6 +1595,7 @@ <translation id="249113932447298600">କ୍ଷମା କରିବେ, ବର୍ତ୍ତମାନ ସମୟରେ ଡିଭାଇସ୍<ph name="DEVICE_LABEL" /> ସମର୍ଥିତ ନୁହେଁ</translation> <translation id="2492461744635776704">ସାର୍ଟିଫିକେଟ୍ ସାଇନ୍ କରିବା ଅନୁରୋଧ ପ୍ରସ୍ତୁତ କରାଯାଉଛି</translation> <translation id="2493126929778606526">ସ୍ୱଚାଳିତ ଭାବେ ଚୟନିତ, ଆପଣଙ୍କର ଶ୍ରେଷ୍ଠ ଫଟୋଗୁଡ଼ିକ</translation> +<translation id="2495524171012645395">ବର୍ତ୍ତମାନ ଦେଖାଯାଇଥିବା ରେସିପିଗୁଡ଼ିକ</translation> <translation id="2496180316473517155">ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି</translation> <translation id="2497229222757901769">ମାଉସ୍ର ବେଗ</translation> <translation id="2497852260688568942">ଆପଣଙ୍କର ବ୍ୟବସ୍ଥାପକଙ୍କ ଦ୍ୱାରା ସିଙ୍କ ଅକ୍ଷମ କରାଯାଇଛି</translation> @@ -3411,6 +3414,7 @@ <translation id="4289732974614035569">ଏକ PIN ବାଛନ୍ତୁ</translation> <translation id="4290791284969893584">ଏକ ପୃଷ୍ଠାକୁ ବନ୍ଦ କରିବା ପରେ, ଆପଣ ଆରମ୍ଭ କରିଥିବା ଟାସ୍କଗୁଡ଼ିକ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇନପାରେ</translation> <translation id="4291265871880246274">ଲଗଇନ ଡାଏଲଗ</translation> +<translation id="429234155571566255">ବର୍ତ୍ତମାନ ଦେଖାଯାଇଥିବା ଏହି ରେସିପିଗୁଡ଼ିକ</translation> <translation id="4295072614469448764">ଆପଣଙ୍କର ଟର୍ମିନଲ୍ରେ ଆପ୍ ଉପଲବ୍ଧ ଅଛି। ଆପଣଙ୍କର ଲଞ୍ଚର୍ରେ ଗୋଟିଏ ଆଇକନ୍ ମଧ୍ୟ ଥାଇପାରେ।</translation> <translation id="4295979599050707005">ଦୟାକରି ଏହା ସୁନିଶ୍ଚିତ କରିବା ପାଇଁ ପୁଣି ସାଇନ୍ ଇନ୍ କରନ୍ତୁ ଯାହା ଦ୍ୱାରା Chrome ଏବଂ Google Playରେ ଆପଣଙ୍କର ଆକାଉଣ୍ଟ <ph name="USER_EMAIL" />କୁ ୱେବସାଇଟ୍ଗୁଡ଼ିକ, ଆପ୍ସ ଏବଂ ଏକ୍ସଟେନସନ୍ଗୁଡ଼ିକ ସହ ବ୍ୟବହାର କରାଯାଇପାରିବ। ଏହି ଆକାଉଣ୍ଟକୁ ଆପଣ ମଧ୍ୟ କାଢ଼ି ପାରନ୍ତି। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="4297219207642690536">ରିର୍ଷ୍ଟାଟ୍ ଏବଂ ରିସେଟ୍ କରନ୍ତୁ</translation> @@ -3471,6 +3475,7 @@ <translation id="435527878592612277">ଆପଣଙ୍କର ଫଟୋ ଚୟନ କରନ୍ତୁ</translation> <translation id="4358302248024731679">ବ୍ଲୁଟୁଥ ସମସ୍ୟାଗୁଡ଼ିକୁ ଆହୁରି ଭଲ ଭାବେ ନିରୂପଣ କରିବା ପାଇଁ, Googler ସେମାନଙ୍କର ମତାମତ ରିପୋର୍ଟ ସହିତ ଅତିରିକ୍ତ ବ୍ଲୁଟୁଥ ଲଗଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରିପାରିବେ। ଏହି ବିକଳ୍ପକୁ ଯାଞ୍ଚ କରାଗଲେ, ଆପଣଙ୍କ ରିପୋର୍ଟରେ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ସେସନରୁ btsnoop ଓ HCI ଲଗଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯିବ, ଯଥାସମ୍ଭବ PIIକୁ କାଢ଼ିବା ପାଇଁ ସାନିଟାଇଜ କରାଯିବ। ଏହି ଲଗଗୁଡ଼ିକର ଆକ୍ସେସକୁ Listnrରେ ଥିବା ChromeOS ପ୍ରଡକ୍ଟ ଗୋଷ୍ଠୀର ପରିଚାଳକମାନଙ୍କ ପାଇଁ ସୀମିତ କରାଯିବ। 90 ଦିନ ପରେ ଲଗଗୁଡ଼ିକୁ ଖାଲି କରିଦିଆଯିବ।</translation> <translation id="4358313196493694334">କ୍ଲିକ୍ ଲୋକେସନ୍ ସ୍ଥିର କରନ୍ତୁ</translation> +<translation id="4358643842961018282">ଆପଣଙ୍କ ଡିଭାଇସ ଅପଟୁଡେଟ ଅଛି</translation> <translation id="4359408040881008151">ନିର୍ଭରଶୀଳ ଏକ୍ସଟେନ୍ସନ୍(ଗୁଡ଼ିକ) କାରଣରୁ ଇନ୍ଷ୍ଟଲ୍ କରାଯାଇଛି।</translation> <translation id="4359717112757026264">ସିଟିସ୍କେପ୍</translation> <translation id="4361142739114356624">କ୍ଲାଏଣ୍ଟ ସାର୍ଟିଫିକେଟ୍ ପାଇଁ ବ୍ୟକ୍ତିଗତ କୀ ନାହିଁ କିମ୍ୱା ଅବୈଧ ଅଟେ</translation> @@ -4762,7 +4767,6 @@ <translation id="5658415415603568799">ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ ସ୍ମାର୍ଟ ଲକ୍ ଆପଣଙ୍କୁ 20 ଘଣ୍ଟା ପରେ ଆପଣଙ୍କର ପାସ୍ୱର୍ଡ ଲେଖିବାକୁ କହିବ।</translation> <translation id="5659593005791499971">ଇମେଲ୍</translation> <translation id="5659833766619490117">ଏହି ପୃଷ୍ଠାଟିକୁ ଅନୁବାଦ କରାଯାଇପାରିବ ନାହିଁ</translation> -<translation id="566097169318652001">ଆପଣଙ୍କ ଡିଭାଇସ ଆଉ ସଠିକ୍ ଭାବେ କାମ କରିନପାରେ ଏବଂ ଆପଣ ସୁରକ୍ଷା ଓ ପରଫରମାନ୍ସ ସମସ୍ୟାଗୁଡ଼ିକର ସମ୍ମୁଖୀନ ହୋଇପାରନ୍ତି। ଆପଣଙ୍କ ଆପ୍ସରେ ଥିବା ମୁଖ୍ୟ ଫିଚରଗୁଡ଼ିକ ପୁରୁଣା ହୋଇଗଲେ ସେଗୁଡ଼ିକ କାମ କରିବା ମଧ୍ୟ ବନ୍ଦ କରିଦେଇପାରେ ଏବଂ ଆପଣ ଆଇନଗତ ଦାବିଗୁଡ଼ିକ କରିବା ପାଇଁ ଆପଣଙ୍କ ଅଧିକାରକୁ ହରାଇବେ।</translation> <translation id="5662513737565158057">Linux ଆପ୍ସ କିପରି କାମ କରିବ ତାହା ବଦଳାନ୍ତୁ।</translation> <translation id="5667293444945855280">ମାଲୱେର୍</translation> <translation id="5667546120811588575">Google Play ସେଟ୍ଅପ୍ କରାଯାଉଛି...</translation> @@ -6080,7 +6084,6 @@ <translation id="697312151395002334">ପପ୍-ଅପଗୁଡ଼ିକ ପଠାଇ ରିଡାଇରେକ୍ଟଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଆଯାଇଛି</translation> <translation id="6973611239564315524">Debian 10 (Buster)ର ଏକ ଅପଗ୍ରେଡ୍ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="69739764870135975">ଯଦି Google ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସନ୍ଧାନ ଇଞ୍ଜିନ ମଧ୍ୟ ହୋଇଥାଏ, ତେବେ ଆପଣ ଆହୁରି ଭଲ, ପ୍ରାସଙ୍ଗିକ ପରାମର୍ଶ ଦେଖିବେ</translation> -<translation id="6974609594866392343">ଅଫ୍ଲାଇନ୍ ଡେମୋ ମୋଡ୍</translation> <translation id="697508444536771064">Linuxକୁ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="6978121630131642226">ସନ୍ଧାନ ଇଞ୍ଜିନଗୁଡିକ</translation> <translation id="6979044105893951891">ପରିଚାଳିତ ଅତିଥି ସମୟ ଅବଧି ଲଞ୍ଚ କରନ୍ତୁ ଏବଂ ଏଥିରୁ ପ୍ରସ୍ଥାନ କରନ୍ତୁ</translation> @@ -7099,6 +7102,7 @@ <translation id="7981313251711023384">ଦ୍ରୁତତର ବ୍ରାଉଜିଂ ଓ ସନ୍ଧାନ ପାଇଁ ପୃଷ୍ଠା ପ୍ରିଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="798145602633458219">ସନ୍ଧାନ ବକ୍ସ ପାଇଁ <ph name="SUGGESTION_NAME" />ରେ ପରାମର୍ଶ ଯୋଡ଼ନ୍ତୁ</translation> <translation id="7981662863948574132">ଡିଭାଇସ୍ EID ଏବଂ QR କୋଡ୍ ପପଅପ୍ ଦେଖାନ୍ତୁ</translation> +<translation id="7981670705071137488">ଏହା ପରେ, ସଫ୍ଟୱେରଗୁଡ଼ିକ ପୃଷ୍ଠପଟରେ ଅପଡେଟ ହେବ। ଆପଣ ସେଟିଂସରେ ଅପଡେଟ ପସନ୍ଦଗୁଡ଼ିକୁ ସମୀକ୍ଷା କରିପାରିବେ।</translation> <translation id="7982083145464587921">ଏହି ତ୍ରୁଟିକୁ ସମାଧାନ କରିବାକୁ ଦୟାକରି ଆପଣଙ୍କର ଡିଭାଇସ୍ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।</translation> <translation id="7982789257301363584">ନେଟୱାର୍କ</translation> <translation id="7984068253310542383">ମିରର୍ <ph name="DISPLAY_NAME" /></translation> @@ -7341,6 +7345,7 @@ <translation id="8214489666383623925">ଫାଇଲ୍ ଖୋଲନ୍ତୁ...</translation> <translation id="8215129063232901118">ଆପଣଙ୍କର <ph name="DEVICE_TYPE" />ରୁ ଆପଣଙ୍କ ଫୋନର ଦକ୍ଷତାକୁ ଆକ୍ସେସ୍ କରନ୍ତୁ</translation> <translation id="8217399928341212914">ଏକାଧିକ ଫାଇଲ୍କୁ ସ୍ୱଚାଳିତ ଡାଉନ୍ଲୋଡ୍ର ଅବରୋଧ କରିବା ଜାରି ରଖନ୍ତୁ</translation> +<translation id="822050276545350872">ଏହା ପରେ, ଅପେକ୍ଷା କରିବା ଆଉ ଆବଶ୍ୟକ ନାହିଁ</translation> <translation id="8221491193165283816">ଆପଣ ସାଧାରଣତଃ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତି। ଏହି ସାଇଟ୍କୁ ଆପଣଙ୍କୁ ସୂଚିତ କରିବା ସୁବିଧା ଦେବା ପାଇଁ, ଏଠାରେ କ୍ଲିକ୍ କରନ୍ତୁ।</translation> <translation id="822347941086490485">HID ଡିଭାଇସଗୁଡ଼ିକୁ ଖୋଜାଯାଉଛି…</translation> <translation id="8225046344534779393">ଇଣ୍ଟରନେଟ କନେକ୍ସନ ଯାଞ୍ଚ କରନ୍ତୁ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 720836c..b5fe8cf0 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -4787,7 +4787,6 @@ <translation id="5658415415603568799">ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, ਸਮਾਰਟ ਲੌਕ ਤੁਹਾਨੂੰ 20 ਘੰਟੇ ਬਾਅਦ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰਨ ਲਈ ਕਹੇਗਾ।</translation> <translation id="5659593005791499971">ਈਮੇਲ</translation> <translation id="5659833766619490117">ਇਸ ਪੰਨੇ ਦਾ ਅਨੁਵਾਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation> -<translation id="566097169318652001">ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਸ਼ਾਇਦ ਹੁਣ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ ਅਤੇ ਤੁਹਾਨੂੰ ਸੁਰੱਖਿਆ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਤੁਹਾਡੀਆਂ ਐਪਾਂ ਦੀਆਂ ਮੁੱਖ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਪੁਰਾਣੀਆਂ ਹੋਣ 'ਤੇ ਸ਼ਾਇਦ ਕੰਮ ਨਾ ਕਰਨ ਅਤੇ ਤੁਸੀਂ ਕਨੂੰਨੀ ਦਾਅਵਾ ਕਰਨ ਦੇ ਆਪਣੇ ਅਧਿਕਾਰ ਨੂੰ ਖੁੰਝਾ ਦਿਓਗੇ।</translation> <translation id="5662513737565158057">Linux ਐਪਾਂ ਦੇ ਕੰਮ ਕਰਨ ਦਾ ਤਰੀਕਾ ਬਦਲੋ।</translation> <translation id="5667293444945855280">ਮਾਲਵੇਅਰ</translation> <translation id="5667546120811588575">Google Play ਸੈੱਟਅੱਪ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> @@ -5641,6 +5640,7 @@ <translation id="6520876759015997832"><ph name="LIST_SIZE" /> ਵਿੱਚੋਂ <ph name="LIST_POSITION" /> ਖੋਜ ਨਤੀਜਾ: <ph name="SEARCH_RESULT_TEXT" />। ਸੈਕਸ਼ਨ 'ਤੇ ਨੈਵੀਗੇਟ ਕਰਨ ਲਈ Enter ਦਬਾਓ।</translation> <translation id="6521214596282732365">ਸਾਈਟਾਂ ਆਮ ਤੌਰ 'ਤੇ ਤੁਹਾਡੇ ਫ਼ੌਂਟ ਵਰਤਦੀਆਂ ਹਨ ਤਾਂ ਜੋ ਤੁਸੀਂ ਆਨਲਾਈਨ ਡਿਜ਼ਾਈਨ ਅਤੇ ਗ੍ਰਾਫ਼ਿਕ ਟੂਲਾਂ ਨਾਲ ਉੱਚ ਵਾਸਤਵਿਕਤਾ ਵਾਲੀ ਸਮੱਗਰੀ ਬਣਾ ਸਕੋ</translation> <translation id="6523303810310758032">ਜਦੋਂ ਤੁਸੀਂ ਆਪਣਾ ਸਾਰਾ ਜਾਂ ਕਿਸੇ ਖਾਸ ਸਾਈਟ ਦਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਮਿਟਾਉਂਦੇ ਹੋ, ਤਾਂ ਇੰਝ ਕਰਨ ਨਾਲ ਸੰਬੰਧਿਤ ਮੁਲਾਂਕਣ ਜਾਣਕਾਰੀ ਵੀ ਮਿਟ ਜਾਂਦੀ ਹੋ। <ph name="BEGIN_LINK" />ਆਪਣਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ<ph name="END_LINK" /> ਦੇਖੋ</translation> +<translation id="6523574494641144162">Google Password Manager ਇਨ੍ਹਾਂ ਪਾਸਵਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="6524735478670290456">ਅਸੀਂ ਇਸ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕਿਵੇਂ ਕਰਦੇ ਹਾਂ:</translation> <translation id="652492607360843641">ਤੁਸੀਂ <ph name="NETWORK_TYPE" /> ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਹੋ।</translation> <translation id="6527303717912515753">ਸ਼ੇਅਰ ਕਰੋ</translation> @@ -5948,6 +5948,7 @@ <translation id="6818198425579322765">ਅਨੁਵਾਦ ਕਰਨ ਲਈ ਪੰਨੇ ਦੀ ਭਾਸ਼ਾ</translation> <translation id="6818547713623251698">ਆਪਣੇ ਫ਼ੋਨ ਦੀਆਂ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ, ਸੂਚਨਾਵਾਂ ਅਤੇ ਐਪਾਂ ਦੇਖੋ</translation> <translation id="6818802132960437751">ਬਿਲਟ-ਇਨ ਵਾਇਰਸ ਸੁਰੱਖਿਆ</translation> +<translation id="6818920801736417483">ਕੀ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨੇ ਹਨ?</translation> <translation id="6823174134746916417">'ਕਲਿੱਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ' ਟੱਚਪੈਡ</translation> <translation id="6824564591481349393">&ਈਮੇਲ ਪਤਾ ਕਾਪੀ ਕਰੋ</translation> <translation id="6824584962142919697">&ਅੰਸ਼ਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation> @@ -6107,7 +6108,6 @@ <translation id="697312151395002334">ਪੌਪ-ਅੱਪ ਭੇਜਣ ਅਤੇ ਰੀਡਾਇਰੈਕਟ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</translation> <translation id="6973611239564315524">Debian 10 (Buster) ਦਾ ਅੱਪਡੇਟ ਉਪਲਬਧ ਹੈ</translation> <translation id="69739764870135975">ਜੇ Google ਹੀ ਤੁਹਾਡਾ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਖੋਜ ਇੰਜਣ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਬਿਹਤਰ ਅਤੇ ਸੰਦਰਭੀ ਤੌਰ 'ਤੇ ਢੁਕਵੇਂ ਸੁਝਾਅ ਦੇਖੋਗੇ</translation> -<translation id="6974609594866392343">ਆਫ਼ਲਾਈਨ ਡੈਮੋ ਮੋਡ</translation> <translation id="697508444536771064">Linux ਬੰਦ ਕਰੋ</translation> <translation id="6978121630131642226">ਖੋਜ ਇੰਜਣ</translation> <translation id="6979044105893951891">ਪ੍ਰਬੰਧਿਤ ਮਹਿਮਾਨ ਸੈਸ਼ਨ ਲਾਂਚ ਕਰੋ ਅਤੇ ਇਹਨਾਂ ਤੋਂ ਬਾਹਰ ਨਿਕਲੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 4d4cb1a..6754f0b 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -4756,7 +4756,6 @@ <translation id="5658415415603568799">Ze względów bezpieczeństwa Smart Lock poprosi Cię o podanie hasła po upływie 20 godzin.</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5659833766619490117">Nie udało się przetłumaczyć tej strony</translation> -<translation id="566097169318652001">Twoje urządzenie może przestać działać prawidłowo i możesz mieć problemy z bezpieczeństwem i wydajnością. W nieaktualnych aplikacjach mogą przestać działać również główne funkcje, co spowoduje utratę możliwości składania roszczeń prawnych.</translation> <translation id="5662513737565158057">Możesz zmienić sposób działania aplikacji na Linuksa.</translation> <translation id="5667293444945855280">Złośliwe oprogramowanie</translation> <translation id="5667546120811588575">Konfiguruję Google Play…</translation> @@ -5610,6 +5609,7 @@ <translation id="6520876759015997832">Wynik wyszukiwania <ph name="LIST_POSITION" /> z <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Aby przejść do tej sekcji, naciśnij Enter.</translation> <translation id="6521214596282732365">Witryny zwykle używają Twoich czcionek, aby umożliwić Ci tworzenie treści wysokiej jakości za pomocą narzędzi online służących do tworzenia grafiki i projektowania</translation> <translation id="6523303810310758032">Jeśli usuniesz swoją historię przeglądania – całą lub dotyczącą określonej witryny – usuniesz także powiązane z nią informacje o pomiarach skuteczności reklam. Zobacz <ph name="BEGIN_LINK" />swoją historię przeglądania<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Menedżerowi haseł Google nie udało się zapisać tych haseł na Twoim koncie Google. Możesz je zapisać na tym urządzeniu.</translation> <translation id="6524735478670290456">Jak wykorzystujemy te dane:</translation> <translation id="652492607360843641">Masz połączenie z siecią <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Udostępnij</translation> @@ -5918,6 +5918,7 @@ <translation id="6818198425579322765">Język strony do przetłumaczenia</translation> <translation id="6818547713623251698">Wyświetlaj zdjęcia, pliki multimedialne, powiadomienia i aplikacje z telefonu</translation> <translation id="6818802132960437751">Wbudowana ochrona antywirusowa</translation> +<translation id="6818920801736417483">Zapisać hasła?</translation> <translation id="6823174134746916417">Kliknięcie przez dotknięcie touchpada</translation> <translation id="6824564591481349393">Kopiuj adres &e-mail</translation> <translation id="6824584962142919697">&Sprawdź elementy</translation> @@ -6077,7 +6078,6 @@ <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> -<translation id="6974609594866392343">Tryb demo offline</translation> <translation id="697508444536771064">Wyłącz Linuksa</translation> <translation id="6978121630131642226">Wyszukiwarki</translation> <translation id="6979044105893951891">Rozpoczynanie i kończenie zarządzanych sesji gościa</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index ab310ed..3511ffb7d 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -133,6 +133,7 @@ <translation id="1124772482545689468">Usuário</translation> <translation id="1125550662859510761">Resolução: <ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativa)</translation> <translation id="1126809382673880764">Não protege você contra sites, downloads e extensões perigosos. Você ainda terá a proteção do "Navegação segura", sempre que possível, em outros Serviços do Google, como o Gmail e a Pesquisa.</translation> +<translation id="1128090040635299943">O Linux está sendo configurado no momento. A configuração vai levar alguns minutos.</translation> <translation id="1128591060186966949">Editar mecanismo de pesquisa</translation> <translation id="1129420403709586868">Veja os arquivos de mídia e fotos do smartphone</translation> <translation id="1129850422003387628">Gerenciar apps</translation> @@ -335,6 +336,7 @@ <translation id="1327794256477341646">Recursos que precisam da localização não funcionarão</translation> <translation id="1329191040029425999">Confira se o dispositivo está atualizado e tente novamente</translation> <translation id="1330145147221172764">Ativar o teclado na tela</translation> +<translation id="1331625853030156663">Para abrir o app <ph name="APP_NAME" />, ative a opção "Mostrar tela de bloqueio ao sair do modo de suspensão"</translation> <translation id="1331977651797684645">Fui eu.</translation> <translation id="1333489022424033687">Alguns recursos em <ph name="ORIGIN" /> podem não funcionar até que você limpe os dados de outros sites armazenados no dispositivo</translation> <translation id="1333965224356556482">Não permitir que os sites acessem seu local</translation> @@ -3348,6 +3350,7 @@ <translation id="420283545744377356">Desativar o protetor de tela</translation> <translation id="4203065553461038553">O nome ou local do arquivo é longo demais</translation> <translation id="4204851595694839599">Como foi sua experiência de jogabilidade?</translation> +<translation id="4205157409548006256">Algo deu errado na configuração do Linux.</translation> <translation id="4206144641569145248">Alienígena</translation> <translation id="4206323443866416204">Relatório de feedback</translation> <translation id="4207522141889799150">Editar permissões do site <ph name="SITE" /></translation> @@ -4790,7 +4793,6 @@ <translation id="5658415415603568799">Para maior segurança, o Smart Lock solicitará que você digite sua senha após 20 horas.</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5659833766619490117">Não foi possível traduzir esta página</translation> -<translation id="566097169318652001">Seu dispositivo pode deixar de funcionar corretamente e você pode enfrentar problemas de segurança e desempenho. Os principais recursos dos seus apps também podem parar de funcionar quando ficarem desatualizados e você vai perder o direito de entrar com ações judiciais.</translation> <translation id="5662513737565158057">Mude o funcionamento dos apps Linux.</translation> <translation id="5667293444945855280">Malware</translation> <translation id="5667546120811588575">Configurando o Google Play…</translation> @@ -5817,6 +5819,7 @@ <translation id="6686665106869989887">A guia foi movida para a direita</translation> <translation id="6686817083349815241">Salvar sua senha</translation> <translation id="6687079240787935001">Ocultar <ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">Solicitação para ler e mudar <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">Peça para <ph name="SUPERVISED_USER_NAME" /> vir até o computador. A criança lerá algumas frases na tela para criar um modelo de voz. <ph name="BR" /> Se <ph name="SUPERVISED_USER_NAME" /> precisar de ajuda para ler, peça para essa criança repetir o que você disser. Sussurre longe do microfone para que o Google Assistente reconheça voz dela, e não a sua.</translation> @@ -6111,7 +6114,6 @@ <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> -<translation id="6974609594866392343">Modo de demonstração off-line</translation> <translation id="697508444536771064">Encerrar o Linux</translation> <translation id="6978121630131642226">Mecanismos de pesquisa</translation> <translation id="6979044105893951891">Iniciar e sair de Sessões de Visitante gerenciadas</translation> @@ -6330,6 +6332,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Sair da página}one{Sair da página}other{Sair das páginas}}</translation> <translation id="7207457272187520234">Envie dados de uso e diagnóstico. No momento, este dispositivo está enviando automaticamente ao Google dados de diagnóstico, de uso de apps e do dispositivo. Eles ajudarão a melhorar o sistema, a estabilidade de apps e muito mais. Alguns dados agregados também ajudarão os apps do Google e nossos parceiros, como os desenvolvedores Android. Essa configuração é aplicada pelo proprietário, Se a configuração "Atividade na Web e de apps adicional" estiver ativada, esses dados poderão ser salvos na sua Conta do Google.</translation> <translation id="7207631048330366454">Pesquisar apps</translation> +<translation id="720808544705441386">Não é possível abrir o app</translation> <translation id="7210499381659830293">Impressoras de extensão</translation> <translation id="7211783048245131419">Nenhum interruptor foi atribuído até o momento</translation> <translation id="7212097698621322584">Insira seu PIN atual para alterá-lo. Se você não sabe seu PIN, redefina a chave de segurança e crie um novo.</translation> @@ -7487,6 +7490,7 @@ <translation id="8324784016256120271">Os sites podem usar cookies para ver sua atividade de navegação em diferentes páginas para, por exemplo, personalizar anúncios</translation> <translation id="8325413836429495820">Bloquear o acesso à área de transferência</translation> <translation id="8326478304147373412">PKCS #7, cadeia de certificados</translation> +<translation id="8327386430364625757">Fonte matemática</translation> <translation id="8327676037044516220">Permissões e configurações de conteúdo</translation> <translation id="8330617762701840933">A lista de sites que redireciona para o navegador alternativo.</translation> <translation id="8330689128072902965">Contatos próximos podem compartilhar com você. Clique para mudar.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 5bddcc016..adb29d2 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -4773,7 +4773,6 @@ <translation id="5658415415603568799">Para maior segurança, o Smart Lock pedir-lhe-á para introduzir a palavra-passe após 20 horas.</translation> <translation id="5659593005791499971">Email</translation> <translation id="5659833766619490117">Não foi possível traduzir esta página</translation> -<translation id="566097169318652001">O seu dispositivo pode ter deixado de funcionar corretamente e pode deparar-se com problemas de segurança e desempenho. As principais funcionalidades nas suas apps também podem deixar de funcionar quando ficarem desatualizadas e irá perder o direito de fazer queixas legais.</translation> <translation id="5662513737565158057">Altere a forma como as apps para Linux irão funcionar.</translation> <translation id="5667293444945855280">Software maligno</translation> <translation id="5667546120811588575">A configurar o Google Play...</translation> @@ -6092,7 +6091,6 @@ <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> -<translation id="6974609594866392343">Modo de demonstração offline</translation> <translation id="697508444536771064">Encerrar o Linux</translation> <translation id="6978121630131642226">Motores de pesquisa</translation> <translation id="6979044105893951891">Inicie e saia das sessões de convidado geridas</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 120f686e..e462087 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -4772,7 +4772,6 @@ <translation id="5658415415603568799">Pentru mai multă siguranță, Smart Lock îți solicită să introduci parola după 20 de ore.</translation> <translation id="5659593005791499971">Adresă de e-mail</translation> <translation id="5659833766619490117">Pagina nu a putut fi tradusă</translation> -<translation id="566097169318652001">Este posibil ca dispozitivul să nu mai funcționeze corespunzător și să întâmpini probleme de securitate și de performanță. În plus, se poate ca funcțiile principale ale aplicațiilor să nu mai ruleze când devin învechite și vei pierde dreptul să faci reclamații legale.</translation> <translation id="5662513737565158057">Schimbă modul în care vor funcționa aplicațiile din Linux.</translation> <translation id="5667293444945855280">Programe malware</translation> <translation id="5667546120811588575">Se configurează Google Play...</translation> @@ -6093,7 +6092,6 @@ <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> -<translation id="6974609594866392343">Modul demo offline</translation> <translation id="697508444536771064">Închide Linux</translation> <translation id="6978121630131642226">Motoarele de căutare</translation> <translation id="6979044105893951891">Lansează și închide sesiunile pentru invitați gestionate</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 7af0521..d55d41c 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -4772,7 +4772,6 @@ <translation id="5658415415603568799">В целях безопасности через 20 часов вам потребуется ввести пароль.</translation> <translation id="5659593005791499971">Эл. почта</translation> <translation id="5659833766619490117">Не удалось перевести страницу</translation> -<translation id="566097169318652001">Возможны сбои в работе устройства, а также проблемы с производительностью и безопасностью. Без обновлений основные функции приложений могут перестать работать и вы утратите право на подачу судебных исков в их отношении.</translation> <translation id="5662513737565158057">Измените параметры работы приложений для Linux.</translation> <translation id="5667293444945855280">Вредоносное ПО</translation> <translation id="5667546120811588575">Настройка Google Play…</translation> @@ -5626,6 +5625,7 @@ <translation id="6520876759015997832">Результат поиска <ph name="LIST_POSITION" /> из <ph name="LIST_SIZE" />: "<ph name="SEARCH_RESULT_TEXT" />". Чтобы перейти в этот раздел, нажмите Ввод.</translation> <translation id="6521214596282732365">Обычно сайты используют ваши шрифты, чтобы вы могли создавать контент высокого качества с помощью онлайн-инструментов для дизайна и графики.</translation> <translation id="6523303810310758032">Если вы удалите историю браузера целиком или для конкретного сайта, то связанные данные об оценке будут также удалены. <ph name="BEGIN_LINK" />Посмотреть историю браузера<ph name="END_LINK" />.</translation> +<translation id="6523574494641144162">Google Менеджеру паролей не удалось сохранить эти пароли в вашем аккаунте Google, но вы можете сохранить их на текущем устройстве.</translation> <translation id="6524735478670290456">Как мы используем эти данные</translation> <translation id="652492607360843641">Вы подключены к следующему типу сети: <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Поделиться</translation> @@ -5936,6 +5936,7 @@ <translation id="6818198425579322765">Исходный язык страницы</translation> <translation id="6818547713623251698">Просмотр фотографий, медиафайлов, уведомлений и приложений с телефона</translation> <translation id="6818802132960437751">Встроенная защита от вирусов</translation> +<translation id="6818920801736417483">Сохранить пароли?</translation> <translation id="6823174134746916417">Нажатие от прикосновения к сенсорной панели</translation> <translation id="6824564591481349393">Скопировать адрес электронной почты</translation> <translation id="6824584962142919697">&Проверить элементы</translation> @@ -6095,7 +6096,6 @@ <translation id="697312151395002334">Разрешить сайтам показывать всплывающие окна или использовать переадресацию</translation> <translation id="6973611239564315524">Доступна версия Debian 10 (Buster).</translation> <translation id="69739764870135975">Если установить Google как поисковую систему по умолчанию, подсказки будут более подходящими по контексту.</translation> -<translation id="6974609594866392343">Демонстрационный офлайн-режим</translation> <translation id="697508444536771064">Завершить работу Linux</translation> <translation id="6978121630131642226">Поисковые системы</translation> <translation id="6979044105893951891">Запуск и завершение управляемых гостевых сеансов</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 35da8ae..e2bc5b28 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -873,6 +873,7 @@ <translation id="1823098433522728610">මෙම ලේඛනයෙහි සංවේදී අන්තර්ගතය ඇත.</translation> <translation id="18245044880483936">උපස්ථ දත්ත ඔබේ දරුවාගේ Drive ගබඩා පංගුවට ගණන් නොගැනෙයි.</translation> <translation id="1825565032302550710">පෝර්ට් එක 1024 සහ 65535 අතර විය යුතුය</translation> +<translation id="182577151972096764">මෑතකදී බැලූ වට්ටෝරු</translation> <translation id="1826192255355608658">ඔබගේ Chrome බ්රව්සරයේ පිටුසන්, මුරපද, ඉතිහාසය සහ තවත් දේ සමමුහුර්ත කරන්න</translation> <translation id="1826516787628120939">පරීක්ෂා කරමින්</translation> <translation id="1827738518074806965">කලාගාරය</translation> @@ -1307,6 +1308,7 @@ <translation id="2241053333139545397">වෙබ් අඩවි ගණනාවක ඔබගේ දත්ත කියවා වෙනස් කරන්න</translation> <translation id="2241634353105152135">හුදෙක් එක් වරක්</translation> <translation id="2242687258748107519">ගොනු තොරතුරු</translation> +<translation id="2246129643805925002">ඔබගේ <ph name="DEVICE_TYPE" /> ඔබට නවතම විශේෂාංග සහ ආරක්ෂක වැඩිදියුණු කිරීම් ලබා දීමට පසුබිමේ ස්වයංක්රීයව යාවත්කාලීන වේ. ඔබට සැකසීම් තුළ යාවත්කාලීන මනාප සමාලෝචනය කළ හැකිය.</translation> <translation id="2246549592927364792">Google වෙතින් රූප විස්තර ලබා ගන්නද?</translation> <translation id="2247738527273549923">මෙම උපාංගය ඔබගේ සංවිධානය මගින් කළමනාකරණය කෙරේ</translation> <translation id="2249111429176737533">පටිත්ත කළ කවුළුව ලෙස විවෘත කරන්න</translation> @@ -1599,6 +1601,7 @@ <translation id="249113932447298600">කණගාටුයි, ඔබේ <ph name="DEVICE_LABEL" /> උපාංගය මේ මොහොතේ සහය නොදක්වයි.</translation> <translation id="2492461744635776704">සහතික අත්සන් කිරීමේ ඉල්ලීම සූදානම් කිරීම</translation> <translation id="2493126929778606526">ස්වයංක්රියව තෝරන ලද, ඔබගේ හොඳම ඡායාරූප</translation> +<translation id="2495524171012645395">මෑතකදී බැලූ වට්ටෝරු</translation> <translation id="2496180316473517155">බ්රවුස් ඉතිහාසය</translation> <translation id="2497229222757901769">මූසික වේගය:</translation> <translation id="2497852260688568942">සමමුහුර්ත කිරීම ඔබේ පරිපාලක විසින් අබල කර ඇත</translation> @@ -3418,6 +3421,7 @@ <translation id="4289732974614035569">PIN එකක් තෝරන්න</translation> <translation id="4290791284969893584">පිටුවක් වැසීමෙන් පසු, ඔබ ආරම්භ කළ කාර්ය අවසන් නොවිය හැකිය</translation> <translation id="4291265871880246274">පිරීමේ සංවාදය</translation> +<translation id="429234155571566255">මෙම මෑතකදී බැලූ වට්ටෝරු</translation> <translation id="4295072614469448764">යෙදුම ඔබගේ පර්යන්තයෙහි ලබා ගත හැක. ඔබගේ දියත්කරණයේ ද නිරූපකයක් තිබෙනු ඇත.</translation> <translation id="4295979599050707005">Chrome සහ Google Play තුළ වෙබ් අඩවි, යෙදුම්, සහ දිගු සමඟ ඔබේ <ph name="USER_EMAIL" /> ගිණුම භාවිත කළ හැකි බව තහවුරු කිරීමට නැවත පුරන්න. ඔබට මෙම ගිණුම ද ඉවත් කළ හැක. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation> <translation id="4297219207642690536">නැවත ඇරඹීම සහ නැවත සැකසීම</translation> @@ -3478,6 +3482,7 @@ <translation id="435527878592612277">ඔබේ ඡායාරූපය තෝරන්න</translation> <translation id="4358302248024731679">බ්ලූටූත් ගැටලු වඩාත් හොඳින් හඳුනා ගැනීම සඳහා, ගූගල්කරුවන් ඔවුන්ගේ ප්රතිපෝෂණ වාර්තා සමඟ අතිරේක බ්ලූටූත් ලොග ඇතුළත් කළ හැකිය. මෙම විකල්පය ලකුණු කරනු ලැබූ විට, ඔබගේ වර්තමාන සැසියේ සිට btsnoop සහ HCI ලොග ඇතුළත් වනු ඇත, හැකි තරම් PII ඉවත් කිරීමට පවිත්ර කෙරේ. මෙම ලොගවලට ප්රවේශය Listnr හි ChromeOS නිෂ්පාදන කණ්ඩායමේ කළමනාකරුවන්ට සීමා වනු ඇත. දින 90කට පසුව ලොග ඉවත් කරනු ලැබේ.</translation> <translation id="4358313196493694334">ක්ලික් කිරීමේ ස්ථානය ස්ථායී කරන්න</translation> +<translation id="4358643842961018282">ඔබගේ උපාංගය යාවත්කාලීනයි</translation> <translation id="4359408040881008151">පරායත්ත දිගුව(දිගු) නිසා ස්ථාපනය කෙරිණි.</translation> <translation id="4359717112757026264">නගර දර්ශන</translation> <translation id="4361142739114356624">මෙම සේවාලාභී සහතිකය සඳහා පුද්ගලික යතුර අතුරුදහන් වී හෝ අවලංගු වී ඇත</translation> @@ -4771,7 +4776,6 @@ <translation id="5658415415603568799">අමතර ආරක්ෂාව සඳහා, Smart Lock පැය 20කට පසු ඔබේ මුරපදය ඇතුළු කිරීමට ඔබෙන් ඉල්ලනු ඇත.</translation> <translation id="5659593005791499971">ඊතැපෑල</translation> <translation id="5659833766619490117">මෙම පිටුව පරිවර්තනය කළ නොහැකි විය</translation> -<translation id="566097169318652001">ඔබගේ උපාංගය තවදුරටත් නිසි ලෙස ක්රියා නොකරනු ඇති අතර, ඔබ ආරක්ෂක සහ කාර්යසාධන ගැටලු අත්විඳිය හැකිය. ඔබගේ යෙදුම්වල ඇති ප්රධාන විශේෂාංග යල් පැන ගිය විට ක්රියා කිරීම නතර විය හැකි අතර ඔබට නීතිමය හිමිකම් පෑමේ අයිතිය අහිමි වනු ඇත.</translation> <translation id="5662513737565158057">ලිනක්ස් යෙදුම් ක්රියා කරන ආකාරය වෙනස් කරන්න.</translation> <translation id="5667293444945855280">අනිෂ්ට මෘදුකාංග</translation> <translation id="5667546120811588575">Google Play පිහිටුවමින්...</translation> @@ -5623,6 +5627,7 @@ <translation id="6520876759015997832">සෙවීම් ප්රතිඵල <ph name="LIST_SIZE" /> න් <ph name="LIST_POSITION" />: <ph name="SEARCH_RESULT_TEXT" />. කොටසට සංචලන වීමට Enter ඔබන්න.</translation> <translation id="6521214596282732365">අඩවි සාමාන්යයෙන් ඔබගේ ෆොන්ට භාවිත කරන බැවින් ඔබට සබැඳි සැලසුම් සහ චිත්රක මෙවලම් සමඟ අත්යනුකූල අන්තර්ගතය තැනිය හැකිය</translation> <translation id="6523303810310758032">ඔබ ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය මකන විට — සියල්ල හෝ නිශ්චිත වෙබ් අඩවියක් සඳහා — ඔබ ආශ්රිත මිනුම් තොරතුරු ද මකයි. <ph name="BEGIN_LINK" />ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය<ph name="END_LINK" /> බලන්න</translation> +<translation id="6523574494641144162">Google මුරපද කළමනාකරුට මෙම මුරපද ඔබගේ Google ගිණුමට සුරැකීමට නොහැකි විය. ඔබට ඒවා මෙම උපාංගයට සුරැකිය හැකිය.</translation> <translation id="6524735478670290456">අප මෙම දත්ත භාවිත කරන ආකාරය:</translation> <translation id="652492607360843641">ඔබ <ph name="NETWORK_TYPE" /> ජාලයකට සම්බන්ධ වී සිටියි.</translation> <translation id="6527303717912515753">බෙදාගන්න</translation> @@ -5929,6 +5934,7 @@ <translation id="6818198425579322765">පරිවර්තන කළ යුතු පිටු භාෂාව</translation> <translation id="6818547713623251698">ඔබගේ දුරකථනයේ ඡායාරූප, මාධ්ය, දැනුම්දීම් සහ යෙදුම් බලන්න</translation> <translation id="6818802132960437751">ආවේණික වෛරස් ආරක්ෂාව</translation> +<translation id="6818920801736417483">මුරපද සුරකින්නද?</translation> <translation id="6823174134746916417">ස්පර්ශ පුවරු ක්ලික් කිරීමට තට්ටු කිරීම</translation> <translation id="6824564591481349393">ඊමේල් ලිපිනය පිටපත් කරන්න (&E)</translation> <translation id="6824584962142919697">&මූලද්රව්ය පරීක්ෂා කරන්න</translation> @@ -6088,7 +6094,6 @@ <translation id="697312151395002334">උත්පතන එවීමට සහ ප්රතියොමු කිරීම් භාවිත කිරීමට ඉඩ දේ</translation> <translation id="6973611239564315524">Debian 10 (Buster) වෙත උත්ශ්රේණි කිරීමක් ලැබේ</translation> <translation id="69739764870135975">Google ඔබගේ පෙරනිමි සෙවීම් යන්ත්රය ද වන්නේ නම්, ඔබ වඩා හොඳ, සන්දර්භානුකූලව අදාළ යෝජනා දකිනු ඇත</translation> -<translation id="6974609594866392343">නොබැඳි ආදර්ශන ප්රකාරය</translation> <translation id="697508444536771064">Linux වසන්න</translation> <translation id="6978121630131642226">සෙවීම් යාන්ත්රණ</translation> <translation id="6979044105893951891">කළමනා කෙරෙන ආරාධිත සැසි දියත් කරන්න සහ එයින් පිටවන්න</translation> @@ -7106,6 +7111,7 @@ <translation id="7981313251711023384">වේගවත් බ්රවුස් කිරීම සහ සෙවීම සඳහා පිටු පෙර පූරණය කරන්න</translation> <translation id="798145602633458219">යෝජනාව <ph name="SUGGESTION_NAME" /> සෙවුම් පෙට්ටියට එකුත කරන්න</translation> <translation id="7981662863948574132">උපාංග EID සහ QR කේත උත්පතනය පෙන්වන්න</translation> +<translation id="7981670705071137488">මෙයින් පසු, මෘදුකාංග යාවත්කාලීන කිරීම් පසුබිමේ සිදු වනු ඇත. ඔබට සැකසීම් තුළ යාවත්කාලීන මනාප සමාලෝචනය කළ හැකිය.</translation> <translation id="7982083145464587921">මෙම දෝෂය නිවැරදි කර ගැනීමට කරුණාකර ඔබේ උපාංගය නැවත අරඹන්න.</translation> <translation id="7982789257301363584">ජාලය</translation> <translation id="7984068253310542383"><ph name="DISPLAY_NAME" /> දර්පණය කරන්න</translation> @@ -7349,6 +7355,7 @@ <translation id="8214489666383623925">ගොනුව විවෘත කරන්න...</translation> <translation id="8215129063232901118">ඔබගේ <ph name="DEVICE_TYPE" /> වෙතින් ඔබගේ දුරකථනයේ හැකියාවලට ප්රවේශ වන්න</translation> <translation id="8217399928341212914">බහුවිධ ගොනුවල ස්වයංක්රිය බාගැනීම් අවහිර කිරීම දිගටම කරගෙන යන්න</translation> +<translation id="822050276545350872">මෙතැන් සිට, රැඳී සිටීම අවශ්ය නොවේ</translation> <translation id="8221491193165283816">ඔබ සාමාන්යයෙන් දැනුම් දීම් අවහිර කරයි. මෙම වෙබ් අඩවියට ඔබට දැනුම්දීමට ඉඩ දීමට, මෙහි ක්ලික් කරන්න.</translation> <translation id="822347941086490485">HID උපාංග සොයමින්...</translation> <translation id="8225046344534779393">අන්තර්ජාල සබැඳුම පරීක්ෂා කරන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index ac8ddc09..8030abb 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -4773,7 +4773,6 @@ <translation id="5658415415603568799">V rámci zvýšenia zabezpečenia vás Smart Lock po uplynutí 20 hodín požiada o zadanie hesla.</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5659833766619490117">Túto stránku sa nepodarilo preložiť</translation> -<translation id="566097169318652001">Vaše zariadenie už nemusí fungovať správne a môže dochádzať k problémom so zabezpečením a výkonnosťou. Keď prestanú byť kľúčové funkcie vo vašich aplikáciách aktuálne, môžu prestať fungovať a vy prídete o právo uplatňovať si právne nároky.</translation> <translation id="5662513737565158057">Zmeňte, ako budú aplikácie pre Linux fungovať.</translation> <translation id="5667293444945855280">Škodlivý softvér</translation> <translation id="5667546120811588575">Nastavuje sa služba Google Play...</translation> @@ -6096,7 +6095,6 @@ <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> -<translation id="6974609594866392343">Offline režim ukážky</translation> <translation id="697508444536771064">Vypnúť Linux</translation> <translation id="6978121630131642226">Vyhľadávače</translation> <translation id="6979044105893951891">Spustenie a ukončenie spravovaných relácií hosťa</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 53817c4..8ad8c93d 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -4792,7 +4792,6 @@ <translation id="5658415415603568799">Zaradi večje varnosti vas bo Smart Lock pozval, da po 20 urah vnesete geslo.</translation> <translation id="5659593005791499971">E-pošta</translation> <translation id="5659833766619490117">Te strani ni bilo mogoče prevesti</translation> -<translation id="566097169318652001">Naprava morda ne deluje več ustrezno in morda se srečujete z varnostnimi težavami in težavami z zmogljivostjo. Prav tako lahko prenehajo delovati ključne funkcije v aplikacijah, če zastarijo, in izgubite lahko pravico do vlaganja zakonitih zahtevkov.</translation> <translation id="5662513737565158057">Spremenite način delovanja aplikacij za Linux.</translation> <translation id="5667293444945855280">Zlonamerna programska oprema</translation> <translation id="5667546120811588575">Nastavljanje Googla Play ...</translation> @@ -6117,7 +6116,6 @@ <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> -<translation id="6974609594866392343">Predstavitveni način brez povezave</translation> <translation id="697508444536771064">Zaustavitev Linuxa</translation> <translation id="6978121630131642226">Iskalniki</translation> <translation id="6979044105893951891">Zagon in zapiranje upravljanih sej gosta</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 62a7807..7adf7b07 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -870,6 +870,7 @@ <translation id="1823098433522728610">Ky dokument ka përmbajtje delikate.</translation> <translation id="18245044880483936">Të dhënat e rezervimit nuk do të llogariten në kuotën e hapësirës ruajtëse të "Diskut" të fëmijës tënd.</translation> <translation id="1825565032302550710">Porta duhet të jetë mes 1024 dhe 65535</translation> +<translation id="182577151972096764">recetat e shikuara së fundi</translation> <translation id="1826192255355608658">Sinkronizo faqeshënuesit, fjalëkalimet, historikun etj. të shfletuesit tënd Chrome</translation> <translation id="1826516787628120939">Po kontrollon</translation> <translation id="1827738518074806965">Galeri arti</translation> @@ -1303,6 +1304,7 @@ <translation id="2241053333139545397">Lexo dhe ndrysho të dhënat e tua në një numër sajtesh uebi</translation> <translation id="2241634353105152135">Vetëm një herë</translation> <translation id="2242687258748107519">Informacioni i skedarit</translation> +<translation id="2246129643805925002"><ph name="DEVICE_TYPE" /> përditësohet automatikisht në sfond për të të dhënë përmirësimet më të fundit të veçorive dhe sigurisë. Mund t'i shqyrtosh preferencat e përditësimeve te "Cilësimet".</translation> <translation id="2246549592927364792">Të merren përshkrimet e imazhit nga Google?</translation> <translation id="2247738527273549923">Pajisja menaxhohet nga organizata jote</translation> <translation id="2249111429176737533">Hape si dritare me skeda</translation> @@ -1593,6 +1595,7 @@ <translation id="249113932447298600">Na vjen keq, por pajisja <ph name="DEVICE_LABEL" /> nuk mbështetet në këtë moment.</translation> <translation id="2492461744635776704">Kërkesa e identifikimit të certifikatës po përgatitet</translation> <translation id="2493126929778606526">Fotografitë e tua më të mira, të zgjedhura automatikisht</translation> +<translation id="2495524171012645395">Recetat e shikuara së fundi</translation> <translation id="2496180316473517155">Historiku i shfletimit</translation> <translation id="2497229222757901769">Shpejtësia e miut</translation> <translation id="2497852260688568942">Sinkronizimi është çaktivizuar nga administratori</translation> @@ -3411,6 +3414,7 @@ <translation id="4289732974614035569">Zgjidh një PIN</translation> <translation id="4290791284969893584">Pasi të mbyllësh një faqe, detyrat që ke nisur mund të mos përfundojnë</translation> <translation id="4291265871880246274">Dialogu i identifikimit</translation> +<translation id="429234155571566255">këto receta të shikuara së fundi</translation> <translation id="4295072614469448764">Aplikacioni ofrohet në terminalin tënd. Mund dhe të ketë një ikonë te "Nisësi" yt.</translation> <translation id="4295979599050707005">Identifikohu përsëri për të konfirmuar se llogaria jote <ph name="USER_EMAIL" /> mund të përdoret me sajtet e uebit, aplikacionet dhe shtesat në Chrome dhe në Google Play. Gjithashtu edhe mund ta heqësh këtë llogari. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Rinis dhe rivendos</translation> @@ -3471,6 +3475,7 @@ <translation id="435527878592612277">Zgjidh foton tënde</translation> <translation id="4358302248024731679">Për të diagnostikuar më mirë problemet e Bluetooth-it, përdoruesit e Google mund të përfshijnë evidenca shtesë të Bluetooth-it me raportet e tyre të komenteve. Kur është i zgjedhur ky opsion, raporti yt do të përfshijë evidencat për btsnoop dhe HCI nga sesioni yt aktual, të pastruara për të hequr sa më shumë informacione personalisht të identifikueshme (PII). Qasja te këto evidenca do të jetë e kufizuar për menaxherët e grupit të produkteve të ChromeOS në Listnr. Evidencat do të hiqen pas 90 ditësh.</translation> <translation id="4358313196493694334">Stabilizo vendndodhjen e klikimit</translation> +<translation id="4358643842961018282">Pajisja jote është e përditësuar</translation> <translation id="4359408040881008151">Instaluar për shkak të shtesës(ave) të varur(a).</translation> <translation id="4359717112757026264">Peizazhe qyteti</translation> <translation id="4361142739114356624">Çelësi privat për këtë "Certifikatë të klientit" mungon ose është i pavlefshëm</translation> @@ -4763,7 +4768,6 @@ <translation id="5658415415603568799">Për siguri të shtuar, Smart Lock do të të kërkojë të fusësh fjalëkalimin pas 20 orësh.</translation> <translation id="5659593005791499971">Mail-i</translation> <translation id="5659833766619490117">Kjo faqe nuk mund të përkthehej</translation> -<translation id="566097169318652001">Pajisja jote mund të mos funksionojë siç duhet dhe mund të kesh probleme me sigurinë dhe performancën. Veçoritë kryesore në aplikacionet e tua mund të ndalojnë së funksionuari gjithashtu kur të ato të vjetërsohen dhe ti do të humbasësh të drejtën tënde për të ngritur pretendime ligjore.</translation> <translation id="5662513737565158057">Ndrysho se si do të funksionojnë aplikacionet e Linux.</translation> <translation id="5667293444945855280">Softuer keqdashës</translation> <translation id="5667546120811588575">Po konfiguron Google Play...</translation> @@ -6080,7 +6084,6 @@ <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> -<translation id="6974609594866392343">Modaliteti i demonstrimit jashtë linje</translation> <translation id="697508444536771064">Mbyll Linux</translation> <translation id="6978121630131642226">Motorët e kërkimit</translation> <translation id="6979044105893951891">Hap dhe dil nga sesionet e menaxhuara për vizitorët</translation> @@ -7098,6 +7101,7 @@ <translation id="7981313251711023384">Ngarkoji paraprakisht faqet për shfletim dhe kërkim më të shpejtë</translation> <translation id="798145602633458219">Bashkëngjite sugjerimin <ph name="SUGGESTION_NAME" /> te kutia e kërkimit</translation> <translation id="7981662863948574132">Shfaq dritaren kërcyese të numrit EID dhe kodit QR të pajisjes</translation> +<translation id="7981670705071137488">Pas kësaj, përditësimet e softuerit do të kryhen në sfond. Mund t'i shqyrtosh preferencat e përditësimeve te "Cilësimet".</translation> <translation id="7982083145464587921">Rinise pajisjen tënde për të rregulluar këtë gabim.</translation> <translation id="7982789257301363584">Rrjeti</translation> <translation id="7984068253310542383">Pasqyro <ph name="DISPLAY_NAME" /></translation> @@ -7341,6 +7345,7 @@ <translation id="8214489666383623925">Hap skedarin...</translation> <translation id="8215129063232901118">Qasu në aftësitë e telefonit nga pajisja <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Vazhdo bllokimin e shkarkimeve automatike të shumë skedarëve</translation> +<translation id="822050276545350872">Nga tani e në vijim, nuk kërkohet më të presësh</translation> <translation id="8221491193165283816">Ti i bllokon zakonisht njoftimet. Për ta lejuar këtë sajt që të të njoftojë, kliko këtu.</translation> <translation id="822347941086490485">Po gjen pajisje HID...</translation> <translation id="8225046344534779393">Kontrollo lidhjen me internetin</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 0009645..e14701f 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -4770,7 +4770,6 @@ <translation id="5658415415603568799">Radi veće bezbednosti Smart Lock će vam tražiti da unesete lozinku posle 20 sati.</translation> <translation id="5659593005791499971">Imejl</translation> <translation id="5659833766619490117">Prevođenje ove stranice nije uspelo</translation> -<translation id="566097169318652001">Uređaj možda više neće raditi kako treba, a vi ćete možda imati problema sa bezbednošću i performansama. Osnovne funkcije u aplikacijama će možda takođe prestati da rade kada postanu zastarele i nećete više imati prava da upućujete pravne tužbe.</translation> <translation id="5662513737565158057">Promenite način na koji Linux aplikacije rade.</translation> <translation id="5667293444945855280">Malver</translation> <translation id="5667546120811588575">Google Play se podešava…</translation> @@ -6093,7 +6092,6 @@ <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> -<translation id="6974609594866392343">Oflajn režim demonstracije</translation> <translation id="697508444536771064">Isključi Linux</translation> <translation id="6978121630131642226">Pretraživači</translation> <translation id="6979044105893951891">Pokretanje i napuštanje sesija gosta kojima se upravlja</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 35e019e..8a4c283c 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -4770,7 +4770,6 @@ <translation id="5658415415603568799">Ради веће безбедности Smart Lock ће вам тражити да унесете лозинку после 20 сати.</translation> <translation id="5659593005791499971">Имејл</translation> <translation id="5659833766619490117">Превођење ове странице није успело</translation> -<translation id="566097169318652001">Уређај можда више неће радити како треба, а ви ћете можда имати проблема са безбедношћу и перформансама. Основне функције у апликацијама ће можда такође престати да раде када постану застареле и нећете више имати права да упућујете правне тужбе.</translation> <translation id="5662513737565158057">Промените начин на који Linux апликације раде.</translation> <translation id="5667293444945855280">Малвер</translation> <translation id="5667546120811588575">Google Play се подешава…</translation> @@ -6093,7 +6092,6 @@ <translation id="697312151395002334">Дозвољено им је да шаљу искачуће прозоре и да користе преусмеравања</translation> <translation id="6973611239564315524">Доступна је надоградња на Debian 10 (Buster)</translation> <translation id="69739764870135975">Ако вам је Google и подразумевани претраживач, видећете боље, контекстуално релевантне предлоге</translation> -<translation id="6974609594866392343">Офлајн режим демонстрације</translation> <translation id="697508444536771064">Искључи Linux</translation> <translation id="6978121630131642226">Претраживачи</translation> <translation id="6979044105893951891">Покретање и напуштање сесија госта којима се управља</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index b9a88b9f7..ba05908 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -884,6 +884,7 @@ <translation id="1823098433522728610">Dokumentet har känsligt innehåll.</translation> <translation id="18245044880483936">Säkerhetskopierad data tar inte upp lagringsutrymme på barnets Drive.</translation> <translation id="1825565032302550710">Portnummer måste vara mellan 1024 och 65535</translation> +<translation id="182577151972096764">nyligen visade recept</translation> <translation id="1826192255355608658">Synkronisera bokmärken, lösenord, historik med mera i webbläsaren Chrome</translation> <translation id="1826516787628120939">Kontrollerar</translation> <translation id="1827738518074806965">Konstgalleri</translation> @@ -1318,6 +1319,7 @@ <translation id="2241053333139545397">Läs och ändra dina uppgifter på ett antal webbplatser</translation> <translation id="2241634353105152135">Bara en gång</translation> <translation id="2242687258748107519">Filinformation</translation> +<translation id="2246129643805925002"><ph name="DEVICE_TYPE" /> uppdateras automatiskt i bakgrunden så att du får de senaste funktionerna och säkerhetsförbättringarna. Du kan hantera uppdateringsalternativen i inställningarna.</translation> <translation id="2246549592927364792">Vill du hämta bildbeskrivningar från Google?</translation> <translation id="2247738527273549923">Enheten hanteras av organisationen.</translation> <translation id="2249111429176737533">Öppna som fönster med flikar</translation> @@ -1610,6 +1612,7 @@ <translation id="249113932447298600">Enheten <ph name="DEVICE_LABEL" /> stöds inte just nu.</translation> <translation id="2492461744635776704">Förbereder begäran om certifikatsignering</translation> <translation id="2493126929778606526">Dina bästa bilder, utvalda automatiskt</translation> +<translation id="2495524171012645395">Nyligen visade recept</translation> <translation id="2496180316473517155">Webbhistorik</translation> <translation id="2497229222757901769">Mushastighet</translation> <translation id="2497852260688568942">Synkronisering har inaktiverats av administratören</translation> @@ -3429,6 +3432,7 @@ <translation id="4289732974614035569">Välj pinkod</translation> <translation id="4290791284969893584">När du stänger en sida kanske åtgärder som du startat inte slutförs</translation> <translation id="4291265871880246274">Dialogruta för inloggning</translation> +<translation id="429234155571566255">dessa nyligen visade recept</translation> <translation id="4295072614469448764">Appen är tillgänglig via terminalen. Det kan också finnas en ikon för den i startprogrammet.</translation> <translation id="4295979599050707005">Bekräfta genom att logga in på nytt att ditt konto, <ph name="USER_EMAIL" />, kan användas med webbplatser, appar och tillägg i Chrome och på Google Play. Du kan även ta bort det här kontot. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Starta om och återställ</translation> @@ -3489,6 +3493,7 @@ <translation id="435527878592612277">Välj foto</translation> <translation id="4358302248024731679">Anställda hos Google kan inkludera ytterligare Bluetooth-loggar i sina feedbackrapporter för att underlätta diagnosticeringen av problem med Bluetooth. När alternativet är markerat ingår HCI-loggar i btsnoop-format från den nuvarande sessionen i din rapport. Dessa loggar rensas på så mycket personligt identifierande information som möjligt. Åtkomsten till loggarna begränsas till ansvariga i produktgruppen för Chrome OS på Listnr. Loggarna raderas permanent efter 90 dagar.</translation> <translation id="4358313196493694334">Stabilisera klickplats</translation> +<translation id="4358643842961018282">Enheten är uppdaterad</translation> <translation id="4359408040881008151">Installerades på grund av ett eller flera tillägg som är beroende av detta tillägg.</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">Det här klientcertifikatets privata nyckel saknas eller är tom</translation> @@ -4782,7 +4787,6 @@ <translation id="5658415415603568799">Av säkerhetsskäl blir du ombedd att ange lösenordet efter 20 timmar med Smart Lock.</translation> <translation id="5659593005791499971">E-post</translation> <translation id="5659833766619490117">Det gick inte att översätta sidan</translation> -<translation id="566097169318652001">Enheten kanske inte fungerar som den ska och säkerhets- och prestandaproblem kan kanske uppstå. Viktiga funktioner i dina appar kan sluta fungera när de blir inaktuella, och du kan förlora rätten till rättslig fordran.</translation> <translation id="5662513737565158057">Ändra hur Linux-appar fungerar.</translation> <translation id="5667293444945855280">Skadlig programvara</translation> <translation id="5667546120811588575">Google Play konfigureras …</translation> @@ -6099,7 +6103,6 @@ <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> -<translation id="6974609594866392343">Demoläge offline</translation> <translation id="697508444536771064">Stäng av Linux</translation> <translation id="6978121630131642226">Sökmotorer</translation> <translation id="6979044105893951891">Starta och avsluta hanterade gästsessioner</translation> @@ -7119,6 +7122,7 @@ <translation id="7981313251711023384">Läs in sidor i förväg så att det går snabbare att surfa och söka</translation> <translation id="798145602633458219">Lägg till förslaget <ph name="SUGGESTION_NAME" /> sist i sökrutan</translation> <translation id="7981662863948574132">Popup-fönster för att visa enhetens EID eller QR-kod</translation> +<translation id="7981670705071137488">Efter detta görs programuppdateringar i bakgrunden. Du kan hantera uppdateringsalternativen i inställningarna.</translation> <translation id="7982083145464587921">Starta om enheten om du vill åtgärda felet.</translation> <translation id="7982789257301363584">Nätverk</translation> <translation id="7984068253310542383">Spegla <ph name="DISPLAY_NAME" /></translation> @@ -7363,6 +7367,7 @@ <translation id="8214489666383623925">Öppna fil...</translation> <translation id="8215129063232901118">Få tillgång till telefonens funktioner via <ph name="DEVICE_TYPE" /></translation> <translation id="8217399928341212914">Fortsätt att blockera automatiska nedladdningar av flera filer</translation> +<translation id="822050276545350872">I fortsättningen behöver du inte vänta</translation> <translation id="8221491193165283816">Du blockerar aviseringar. Klicka här om du vill tillåta aviseringar från webbplatsen.</translation> <translation id="822347941086490485">Söker efter HID-enheter …</translation> <translation id="8225046344534779393">Kontrollera internetanslutningen</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index d9f448c..7cadc7f 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -881,6 +881,7 @@ <translation id="1823098433522728610">Hati hii ina maudhui nyeti.</translation> <translation id="18245044880483936">Nakala ya data iliyohifadhiwa haitahesabiwa katika mgawo wa nafasi ya Hifadhi ya Google ya mtoto wako.</translation> <translation id="1825565032302550710">Lazima mlango uwe kati ya 1024 na 65535</translation> +<translation id="182577151972096764">mapishi yaliyotazamwa hivi karibuni</translation> <translation id="1826192255355608658">Sawazisha alamisho, manenosiri, historia na vipengee vyako vingine vya kivinjari cha Chrome</translation> <translation id="1826516787628120939">Inakagua</translation> <translation id="1827738518074806965">Matunzio ya sanaa</translation> @@ -1314,6 +1315,7 @@ <translation id="2241053333139545397">Kusoma na kubadilisha data yako kwenye tovuti kadhaa</translation> <translation id="2241634353105152135">Mara moja tu</translation> <translation id="2242687258748107519">Maelezo ya Faili</translation> +<translation id="2246129643805925002"><ph name="DEVICE_TYPE" /> yako husasisha kiotomatiki chinichini ili kukupatia vipengele vipya zaidi na maboresho ya usalama. Unaweza kukagua mapendeleo ya sasisho kwenye Mipangilio.</translation> <translation id="2246549592927364792">Ungependa kupata ufafanuzi wa picha kutoka Google?</translation> <translation id="2247738527273549923">Kifaa chako kinadhibitiwa na shirika lako</translation> <translation id="2249111429176737533">Fungua kama dirisha lenye vichupo</translation> @@ -1607,6 +1609,7 @@ <translation id="249113932447298600">Samahani, kifaa <ph name="DEVICE_LABEL" /> hakihimiliwi kwa wakati huu.</translation> <translation id="2492461744635776704">Inatayarisha ombi la kuambatisha cheti</translation> <translation id="2493126929778606526">Picha zako bora zaidi, zilizochaguliwa kiotomatiki</translation> +<translation id="2495524171012645395">Mapishi yaliyotazamwa hivi karibuni</translation> <translation id="2496180316473517155">Historia ya kuvinjari</translation> <translation id="2497229222757901769">Kasi ya kipanya</translation> <translation id="2497852260688568942">Usawazishaji umezimwa na msimamizi wako</translation> @@ -3424,6 +3427,7 @@ <translation id="4289732974614035569">Chagua PIN</translation> <translation id="4290791284969893584">Baada ya kufunga ukurasa, huenda majukumu uliyoyaanza yasimalizike</translation> <translation id="4291265871880246274">Kidirisha cha Kuingia katika akaunti</translation> +<translation id="429234155571566255">mapishi haya yaliyotazamwa hivi karibuni</translation> <translation id="4295072614469448764">Programu inapatikana kwenye kituo chako. Huenda pia kukawa na aikoni kwenye Kifungua programu chako.</translation> <translation id="4295979599050707005">Tafadhali ingia katika akaunti tena ili uthibitishe kwamba akaunti yako ya <ph name="USER_EMAIL" /> inaweza kutumika katika tovuti, programu na viendelezi kwenye Chrome na Google Play. Unaweza pia kuondoa akaunti hii. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Zima kisha uwashe na uweke upya</translation> @@ -3484,6 +3488,7 @@ <translation id="435527878592612277">Chagua picha yako</translation> <translation id="4358302248024731679">Ili kutambua matatizo ya Bluetooth vizuri zaidi, WanaGoogle wanaweza kujumuisha kumbukumbu za ziada za Bluetooth kwenye ripoti zao za maoni. Wakati umeteua chaguo hili, ripoti yako itajumuisha kumbukumbu za btsnoop na HCI kuanzia kipindi chako cha sasa, zilizosafishwa ili kuondoa PII nyingi kadri iwezekanavyo. Wasimamizi wa kundi la bidhaa ya Mfumo wa Uendeshaji wa Chrome katika Listnr ndio tu wataweza kufikia kumbukumbu hizi. Kumbukumbu zitaondolewa kabisa baada ya siku 90.</translation> <translation id="4358313196493694334">Imarisha eneo la kubofya</translation> +<translation id="4358643842961018282">Kifaa chako kimesasishwa</translation> <translation id="4359408040881008151">Kilisakinishwa kwa sababu ya kiendelezi au viendelezi vinavyotegemea.</translation> <translation id="4359717112757026264">Mandhari ya jiji</translation> <translation id="4361142739114356624">Ufunguo wa Faragha wa Cheti hiki cha Seva Teja haupo au si sahihi</translation> @@ -4777,7 +4782,6 @@ <translation id="5658415415603568799">Kwa usalama wa ziada, Smart Lock itakuomba uweke nenosiri lako baada ya saa 20.</translation> <translation id="5659593005791499971">Barua pepe</translation> <translation id="5659833766619490117">Imeshindwa kutafsiri ukurasa huu</translation> -<translation id="566097169318652001">Huenda kifaa chako kisifanye kazi vizuri na unaweza kukumbwa na matatizo ya kiusalama na kiutendaji. Vipengele muhimu katika programu zako pia vinaweza kuacha kufanya kazi vinapopitwa na wakati na utapoteza haki yako ya kufungua madai ya kisheria.</translation> <translation id="5662513737565158057">Badilisha jinsi programu za Linux zitafanya kazi.</translation> <translation id="5667293444945855280">Programu hasidi</translation> <translation id="5667546120811588575">Inaweka mipangilio ya Google Play...</translation> @@ -6094,7 +6098,6 @@ <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> -<translation id="6974609594866392343">Hali ya onyesho la nje ya mtando</translation> <translation id="697508444536771064">Zima Linux</translation> <translation id="6978121630131642226">Injini tafuti</translation> <translation id="6979044105893951891">Kuanzisha na kufunga vipindi vya mgeni vinavyodhibitiwa</translation> @@ -7115,6 +7118,7 @@ <translation id="7981313251711023384">Pakia mapema kurasa ili upate huduma ya haraka ya kuvinjari na kutafuta</translation> <translation id="798145602633458219">Weka pendekezo la <ph name="SUGGESTION_NAME" /> kwenye kisanduku cha kutafutia</translation> <translation id="7981662863948574132">Onyesha dirisha ibukizi la EID na Msimbo wa QR wa kifaa</translation> +<translation id="7981670705071137488">Baada ya hapa, usasishaji wa programu utafanyika chinichini. Unaweza kukagua mapendeleo ya sasisho kwenye Mipangilio.</translation> <translation id="7982083145464587921">Tafadhali zima na uwashe kifaa chako ili kurekebisha hitilafu hii.</translation> <translation id="7982789257301363584">Mtandao</translation> <translation id="7984068253310542383">Onyesho <ph name="DISPLAY_NAME" /></translation> @@ -7359,6 +7363,7 @@ <translation id="8214489666383623925">Fungua Faili...</translation> <translation id="8215129063232901118">Fikia vipengele vya simu yako kwenye <ph name="DEVICE_TYPE" /> yako</translation> <translation id="8217399928341212914">Endelea kuzuia upakuaji otomatiki wa faili nyingi</translation> +<translation id="822050276545350872">Kuanzia hapa na kuendelea, hutahitaji kusubiri</translation> <translation id="8221491193165283816">Huwa unazuia arifa. Ili uruhusu tovuti hii ikuarifu, bofya hapa.</translation> <translation id="822347941086490485">Inatafuta vifaa vya HID...</translation> <translation id="8225046344534779393">Kagua muunganisho wa intaneti</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 3fd2f6e..31f5e8c 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -4788,7 +4788,6 @@ <translation id="5658415415603568799">கூடுதல் பாதுகாப்பிற்கு, 20 மணிநேரம் கழித்து கடவுச்சொல்லை உள்ளிடும்படி Smart Lock உங்களைக் கேட்கும்.</translation> <translation id="5659593005791499971">மின்னஞ்சல்</translation> <translation id="5659833766619490117">இந்தப் பக்கத்தை மொழிபெயர்க்க முடியவில்லை</translation> -<translation id="566097169318652001">உங்கள் சாதனம் சரியாகச் செயல்படாமல் போகக்கூடும். அத்துடன் பாதுகாப்பு மற்றும் செயல்திறன் சிக்கல்களும் ஏற்படக்கூடும். ஆப்ஸின் பதிப்பு பழையதாக இருந்தால் அவற்றின் முக்கிய அம்சங்களும் செயல்படாமல் போகக்கூடும். அத்துடன் சட்டப்பூர்வ உரிமைகோரல்களுக்கான உரிமையையும் நீங்கள் இழப்பீர்கள்.</translation> <translation id="5662513737565158057">Linux ஆப்ஸ் வேலை செய்யும் விதத்தை மாற்றுங்கள்.</translation> <translation id="5667293444945855280">மால்வேர்</translation> <translation id="5667546120811588575">Google Playஐ அமைக்கிறது...</translation> @@ -5642,6 +5641,7 @@ <translation id="6520876759015997832"><ph name="LIST_SIZE" /> தேடல் முடிவுகளில் <ph name="LIST_POSITION" />வது இடம்: <ph name="SEARCH_RESULT_TEXT" />. இந்தப் பிரிவிற்குச் செல்ல Enter விசையை அழுத்தவும்.</translation> <translation id="6521214596282732365">தளங்கள் பொதுவாக உங்கள் எழுத்து வடிவங்களைப் பயன்படுத்தும் என்பதால் ஆன்லைன் டிசைன் & கிராஃபிக்ஸ் கருவிகளைப் பயன்படுத்தி உயர் துல்லியத்தில் உள்ளடக்கத்தை உருவாக்கலாம்</translation> <translation id="6523303810310758032">நீங்கள் இதுவரை இணையத்தில் பார்த்தவை அல்லது குறிப்பிட்ட தளத்தில் பார்த்தவை பற்றிய தகவலை நீக்கினால் அதற்குத் தொடர்புடைய அளவீட்டுத் தகவலும் நீக்கப்படும். நீங்கள் <ph name="BEGIN_LINK" />இதுவரை இணையத்தில் பார்த்தவற்றைப்<ph name="END_LINK" /> பாருங்கள்</translation> +<translation id="6523574494641144162">Google Password Managerரினால் இந்தக் கடவுச்சொற்களை உங்கள் Google கணக்கில் சேமிக்க முடியவில்லை. அவற்றை நீங்கள் இந்தச் சாதனத்தில் சேமிக்கலாம்.</translation> <translation id="6524735478670290456">இந்தத் தரவை எப்படிப் பயன்படுத்துவோம்?</translation> <translation id="652492607360843641">இப்போது <ph name="NETWORK_TYPE" /> நெட்வொர்க்கைப் பயன்படுத்துகிறீர்கள்.</translation> <translation id="6527303717912515753">பகிர்</translation> @@ -5946,6 +5946,7 @@ <translation id="6818198425579322765">மொழியாக்கம் செய்யப்பட வேண்டிய பக்கத்தின் மொழி</translation> <translation id="6818547713623251698">மொபைலில் உள்ள படங்கள், மீடியா, அறிவிப்புகள், ஆப்ஸ் ஆகியவற்றைப் பார்க்கலாம்</translation> <translation id="6818802132960437751">உள்ளமைந்த வைரஸ் தடுப்பு</translation> +<translation id="6818920801736417483">கடவுச்சொற்களைச் சேமிக்கவா?</translation> <translation id="6823174134746916417">டச்பேட் 'கிளிக் செய்ய தட்டு'</translation> <translation id="6824564591481349393">&மின்னஞ்சல் முகவரியை நகலெடு</translation> <translation id="6824584962142919697">&கூறுகளை ஆய்வு செய்</translation> @@ -6105,7 +6106,6 @@ <translation id="697312151395002334">பாப்-அப்களை அனுப்புவதற்கும் திசைதிருப்புதல்களைப் பயன்படுத்துவதற்கும் அனுமதிக்கப்பட்டுள்ள தளங்கள்</translation> <translation id="6973611239564315524">Debian 10 (Buster) தொடர்பான புதுப்பிப்பு உள்ளது</translation> <translation id="69739764870135975">உங்களின் இயல்புத் தேடல் இன்ஜினாகவும் Google இருந்தால் சூழலுக்குத் தொடர்புடைய சிறப்பான பரிந்துரைகள் காட்டப்படும்</translation> -<translation id="6974609594866392343">ஆஃப்லைன் டெமோ பயன்முறை</translation> <translation id="697508444536771064">Linuxஸை ஷட்-டவுன் செய்</translation> <translation id="6978121630131642226">தேடல் இன்ஜின்கள்</translation> <translation id="6979044105893951891">நிர்வகிக்கப்பட்ட கெஸ்ட் அமர்வுகளைத் தொடங்கும்/வெளியேறும் அனுமதி</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 9f0937b..6224dd73 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -4786,7 +4786,6 @@ <translation id="5658415415603568799">అదనపు భద్రత కోసం, 20 గంటల తర్వాత మీ పాస్వర్డ్ను నమోదు చేయమని మీ Smart Lock అడుగుతుంది.</translation> <translation id="5659593005791499971">ఈమెయిల్</translation> <translation id="5659833766619490117">ఈ పేజీని అనువదించడం సాధ్యపడలేదు</translation> -<translation id="566097169318652001">మీ పరికరం ఇకపై సరిగ్గా పని చేయకపోవచ్చు, మీరు సెక్యూరిటీ, పనితీరుకు సంబంధించిన సమస్యలను ఎదుర్కోవచ్చు. మీ యాప్లలోని ముఖ్య ఫీచర్లు పాతవి అయినప్పుడు కూడా పని చేయడం ఆగిపోవచ్చు, మీరు చట్టపరమైన దావాలు చేసే హక్కును కోల్పోతారు.</translation> <translation id="5662513737565158057">Linux యాప్లు పనిచేసే తీరును మార్చండి.</translation> <translation id="5667293444945855280">మాల్వేర్</translation> <translation id="5667546120811588575">Google Play సెటప్ చేస్తోంది...</translation> @@ -6105,7 +6104,6 @@ <translation id="697312151395002334">పాప్-అప్లను పంపడానికి, అలాగే మళ్లింపులను ఉపయోగించడానికి అనుమతించబడింది</translation> <translation id="6973611239564315524">Debian 10 (Buster)కు అప్గ్రేడ్ అందుబాటులో ఉంది</translation> <translation id="69739764870135975">అలాగే Google మీ ఆటోమేటిక్ సెర్చ్ ఇంజిన్ అయితే, మీకు మరింత సందర్భోచితమైన సూచనలు కనిపిస్తాయి</translation> -<translation id="6974609594866392343">ఆఫ్లైన్ డెమో మోడ్</translation> <translation id="697508444536771064">Linuxను షట్ డౌన్ చేయండి</translation> <translation id="6978121630131642226">శోధన ఇంజిన్లు</translation> <translation id="6979044105893951891">నిర్వాహిత అతిథి సెషన్లను ప్రారంభించడం మరియు విడిచిపెట్టడం</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 5b16a91d..2bfbfcb 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -131,6 +131,7 @@ <translation id="1124772482545689468">ผู้ใช้</translation> <translation id="1125550662859510761">ดูเหมือน <ph name="WIDTH" /> x <ph name="HEIGHT" /> (ค่าดั้งเดิม)</translation> <translation id="1126809382673880764">ไม่ปกป้องคุณจากเว็บไซต์ การดาวน์โหลด และส่วนขยายที่เป็นอันตราย คุณจะยังคงได้รับการปกป้องจาก Google Safe Browsing ในบริการอื่นๆ ของ Google ที่มีฟีเจอร์นี้ เช่น Gmail และ Search</translation> +<translation id="1128090040635299943">กำลังกำหนดค่า Linux อยู่ ซึ่งจะใช้เวลาสักครู่</translation> <translation id="1128591060186966949">แก้ไขเครื่องมือค้นหา</translation> <translation id="1129420403709586868">ดูรูปภาพและสื่อของโทรศัพท์</translation> <translation id="1129850422003387628">จัดการแอป</translation> @@ -332,6 +333,7 @@ <translation id="1327794256477341646">ฟีเจอร์ที่ต้องใช้ตำแหน่งของคุณจะไม่ทำงาน</translation> <translation id="1329191040029425999">โปรดตรวจสอบว่าอุปกรณ์เป็นเวอร์ชันล่าสุด แล้วลองอีกครั้ง</translation> <translation id="1330145147221172764">เปิดใช้แป้นพิมพ์บนหน้าจอ</translation> +<translation id="1331625853030156663">หากต้องการเปิด <ph name="APP_NAME" /> ให้เปิดใช้ "แสดงหน้าจอล็อกเมื่อปลุกให้ทำงานจากโหมดสลีป"</translation> <translation id="1331977651797684645">นี่คือฉันเอง</translation> <translation id="1333489022424033687">ฟีเจอร์บางอย่างใน <ph name="ORIGIN" /> อาจไม่ทำงานจนกว่าคุณจะล้างข้อมูลที่เว็บไซต์อื่นๆ จัดเก็บไว้ในอุปกรณ์ของคุณ</translation> <translation id="1333965224356556482">ไม่อนุญาตให้เว็บไซต์ดูตำแหน่งของคุณ</translation> @@ -3331,6 +3333,7 @@ <translation id="420283545744377356">ปิดโปรแกรมรักษาหน้าจอ</translation> <translation id="4203065553461038553">ชื่อหรือตำแหน่งของไฟล์ยาวเกินไป</translation> <translation id="4204851595694839599">ประสบการณ์การเล่นเกมของคุณเป็นอย่างไรบ้าง</translation> +<translation id="4205157409548006256">เกิดข้อผิดพลาดขณะกำหนดค่า Linux</translation> <translation id="4206144641569145248">มนุษย์ต่างดาว</translation> <translation id="4206323443866416204">รายงานความคิดเห็น</translation> <translation id="4207522141889799150">แก้ไขสิทธิ์ของเว็บไซต์สำหรับ <ph name="SITE" /></translation> @@ -4769,7 +4772,6 @@ <translation id="5658415415603568799">Smart Lock จะขอให้คุณป้อนรหัสผ่านเมื่อผ่านไปแล้ว 20 ชั่วโมงเพื่อเพิ่มความปลอดภัย</translation> <translation id="5659593005791499971">อีเมล</translation> <translation id="5659833766619490117">แปลหน้านี้ไม่ได้</translation> -<translation id="566097169318652001">อุปกรณ์อาจทำงานไม่ถูกต้องอีกต่อไป และคุณอาจประสบปัญหาด้านความปลอดภัยและประสิทธิภาพ ฟีเจอร์หลักในแอปอาจหยุดทำงานด้วยเช่นกันเมื่อไม่ได้รับการอัปเดต และคุณจะเสียสิทธิ์ในการอ้างสิทธิ์ตามกฎหมาย</translation> <translation id="5662513737565158057">เปลี่ยนลักษณะที่แอป Linux จะทำงาน</translation> <translation id="5667293444945855280">มัลแวร์</translation> <translation id="5667546120811588575">กำลังตั้งค่า Google Play...</translation> @@ -5793,6 +5795,7 @@ <translation id="6686665106869989887">แท็บถูกย้ายไปทางขวา</translation> <translation id="6686817083349815241">บันทึกรหัสผ่าน</translation> <translation id="6687079240787935001">ซ่อน<ph name="MODULE_TITLE" /></translation> +<translation id="6688391094668641513">กำลังขออ่านและเปลี่ยนแปลง <ph name="ORIGIN" />:</translation> <translation id="6689714331348768690">ขอให้ <ph name="SUPERVISED_USER_NAME" /> มาที่คอมพิวเตอร์ บุตรหลานจะได้อ่านข้อความ 2-3 วลีบนหน้าจอนี้เพื่อสร้างรูปแบบเสียงของตน <ph name="BR" /> หาก <ph name="SUPERVISED_USER_NAME" /> ยังอ่านหนังสือไม่คล่อง ให้บุตรหลานอ่านตามคุณ ให้คุณอ่านเบาๆ และห่างจากไมค์ เพื่อให้ Assistant จดจำเสียงของบุตรหลานไม่ใช่เสียงของคุณ</translation> @@ -6087,7 +6090,6 @@ <translation id="697312151395002334">ได้รับอนุญาตให้ส่งป๊อปอัปและใช้การเปลี่ยนเส้นทาง</translation> <translation id="6973611239564315524">มีการอัปเกรดเป็น Debian 10 (Buster) พร้อมใช้งาน</translation> <translation id="69739764870135975">หาก Google เป็นเครื่องมือค้นหาเริ่มต้นของคุณด้วย คุณจะเห็นคำแนะนำที่มีประสิทธิภาพและเกี่ยวข้องกับบริบทมากยิ่งขึ้น</translation> -<translation id="6974609594866392343">โหมดสาธิตแบบออฟไลน์</translation> <translation id="697508444536771064">ปิด Linux</translation> <translation id="6978121630131642226">เครื่องมือค้นหา</translation> <translation id="6979044105893951891">เปิดและออกจากเซสชันผู้เยี่ยมชมที่มีการจัดการ</translation> @@ -6306,6 +6308,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{หน้าที่ออกไป}other{หน้าที่ออกไป}}</translation> <translation id="7207457272187520234">ส่งข้อมูลการใช้งานและการวินิจฉัย ปัจจุบันอุปกรณ์นี้ส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ ซึ่งจะช่วยให้แอปและระบบมีความเสถียร พร้อมทั้งปรับปรุงด้านอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาแอป Android เจ้าของเป็นผู้บังคับใช้การตั้งค่านี้ หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปไว้ ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของคุณ</translation> <translation id="7207631048330366454">ค้นหาแอป</translation> +<translation id="720808544705441386">เปิดแอปไม่ได้</translation> <translation id="7210499381659830293">เครื่องพิมพ์ที่สั่งการผ่านส่วนขยาย</translation> <translation id="7211783048245131419">ยังไม่ได้กำหนดสวิตช์</translation> <translation id="7212097698621322584">ป้อน PIN ปัจจุบันเพื่อเปลี่ยน PIN หากไม่ทราบ PIN คุณจะต้องรีเซ็ตคีย์ความปลอดภัย แล้วสร้าง PIN ใหม่</translation> @@ -7462,6 +7465,7 @@ <translation id="8324784016256120271">เว็บไซต์ใช้คุกกี้เพื่อดูกิจกรรมการท่องเว็บของคุณในเว็บไซต์ต่างๆ ได้ เช่น เพื่อปรับโฆษณาตามโปรไฟล์ของคุณ</translation> <translation id="8325413836429495820">ไม่ได้รับอนุญาตให้ดูคลิปบอร์ด</translation> <translation id="8326478304147373412">PKCS #7, กลุ่มใบรับรอง (Certificate Chain)</translation> +<translation id="8327386430364625757">แบบอักษรทางคณิตศาสตร์</translation> <translation id="8327676037044516220">การตั้งค่าสิทธิ์และเนื้อหา</translation> <translation id="8330617762701840933">รายการเว็บไซต์ที่เปลี่ยนเส้นทางไปยังเบราว์เซอร์สำรองได้</translation> <translation id="8330689128072902965">ผู้ติดต่อใกล้เคียงจะแชร์กับคุณได้ คลิกเพื่อเปลี่ยน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index d2d1388..3575a7c 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -4769,7 +4769,6 @@ <translation id="5658415415603568799">Daha fazla güvenlik için Smart Lock 20 saat sonra şifrenizi girmenizi isteyecektir.</translation> <translation id="5659593005791499971">E-posta</translation> <translation id="5659833766619490117">Bu sayfa çevrilemedi</translation> -<translation id="566097169318652001">Cihazınız artık düzgün çalışmayabilir, ayrıca güvenlik ve performans sorunları yaşayabilirsiniz. Uygulamalarınızdaki temel özellikler de eskidiğinde çalışmayı durdurabilir ve hak talebinde bulunamazsınız.</translation> <translation id="5662513737565158057">Linux uygulamalarının çalışma şeklini değiştirin.</translation> <translation id="5667293444945855280">Kötü Amaçlı Yazılım</translation> <translation id="5667546120811588575">Google Play kuruluyor...</translation> @@ -5623,6 +5622,7 @@ <translation id="6520876759015997832"><ph name="LIST_POSITION" />/<ph name="LIST_SIZE" /> arama sonucu: <ph name="SEARCH_RESULT_TEXT" />. Bölüme gitmek için Enter'a basın.</translation> <translation id="6521214596282732365">Online tasarım ve grafik araçlarıyla yüksek kaliteli içerikler oluşturabilmeniz için siteler genellikle sizin yazı tiplerinizi kullanır</translation> <translation id="6523303810310758032">Belirli bir siteye ait veya tüm tarama geçmişinizi sildiğinizde bununla ilişkilendirilmiş ölçüm bilgilerini de silmiş olursunuz. <ph name="BEGIN_LINK" />Tarama geçmişinize<ph name="END_LINK" /> bakın</translation> +<translation id="6523574494641144162">Google Şifre Yöneticisi bu şifreleri Google Hesabınıza kaydedemedi. Şifreleri bu cihaza kaydedebilirsiniz.</translation> <translation id="6524735478670290456">Bu verileri nasıl kullanırız?</translation> <translation id="652492607360843641"><ph name="NETWORK_TYPE" /> bir ağa bağlısınız.</translation> <translation id="6527303717912515753">Paylaş</translation> @@ -5927,6 +5927,7 @@ <translation id="6818198425579322765">Çevrilecek Sayfanın Dili</translation> <translation id="6818547713623251698">Telefonunuzdaki fotoğrafları, medya içeriklerini, bildirimleri ve uygulamaları görün</translation> <translation id="6818802132960437751">Virüse karşı yerleşik koruma</translation> +<translation id="6818920801736417483">Şifreler kaydedilsin mi?</translation> <translation id="6823174134746916417">Dokunmatik alanda tıklamak için dokun</translation> <translation id="6824564591481349393">&E-posta Adresini Kopyala</translation> <translation id="6824584962142919697">Öğeleri &incele</translation> @@ -6086,7 +6087,6 @@ <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> -<translation id="6974609594866392343">Çevrimdışı demo modu</translation> <translation id="697508444536771064">Linux'u kapat</translation> <translation id="6978121630131642226">Arama Motorları</translation> <translation id="6979044105893951891">Yönetilen misafir oturumunlarını başlatma ve oturumlardan çıkma</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 3a4d72a..4c639b4 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1135,7 +1135,7 @@ <translation id="2078019350989722914">Попереджати перед виходом (<ph name="KEY_EQUIVALENT" />)</translation> <translation id="2079053412993822885">Якщо видалити один зі своїх власних сертифікатів, ви більше не зможете використовувати його для власної ідентифікації.</translation> <translation id="2079545284768500474">Відмінити</translation> -<translation id="2080070583977670716">Більше налаштувань</translation> +<translation id="2080070583977670716">Інші налаштування</translation> <translation id="2081816110395725788">Пристрій неактивний і не заряджається</translation> <translation id="2082187087049518845">Додати вкладку в групу</translation> <translation id="2082510809738716738">Виберіть колір теми</translation> @@ -4788,7 +4788,6 @@ <translation id="5658415415603568799">З міркувань безпеки Smart Lock запропонує ввести пароль через 20 годин.</translation> <translation id="5659593005791499971">Ел. пошта</translation> <translation id="5659833766619490117">Цю сторінку неможливо перекласти</translation> -<translation id="566097169318652001">Ваш пристрій може працювати неналежним чином, і у вас можуть виникати проблеми з безпекою та продуктивністю. Також у вашому додатку можуть перестати працювати основні функції (коли стануть застарілими), і ви втратите право подавати судові позови.</translation> <translation id="5662513737565158057">Налаштуйте роботу додатків Linux.</translation> <translation id="5667293444945855280">Шкідливі програми</translation> <translation id="5667546120811588575">Налаштування Google Play…</translation> @@ -5641,6 +5640,7 @@ <translation id="6520876759015997832">Результат пошуку <ph name="LIST_POSITION" /> з <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Натисніть Enter, щоб перейти до розділу.</translation> <translation id="6521214596282732365">Сайти зазвичай використовують шрифти, щоб ви могли створювати контент високої якості за допомогою онлайн-інструментів для дизайну та графіки</translation> <translation id="6523303810310758032">Коли ви видаляєте історію веб-перегляду (повністю або для певного сайту), також вилучається інформація для вимірювання ефективності. Перегляньте <ph name="BEGIN_LINK" />історію веб-перегляду<ph name="END_LINK" />.</translation> +<translation id="6523574494641144162">Google Менеджеру паролів не вдалося зберегти ці паролі у вашому обліковому записі Google. Ви можете зберегти їх на цей пристрій.</translation> <translation id="6524735478670290456">Як ми використовуємо ці дані</translation> <translation id="652492607360843641">Пристрій під'єднано до такої мережі: <ph name="NETWORK_TYPE" />.</translation> <translation id="6527303717912515753">Надіслати</translation> @@ -5951,6 +5951,7 @@ <translation id="6818198425579322765">Мова сторінки для перекладу</translation> <translation id="6818547713623251698">Переглядайте фотографії, медіафайли, сповіщення й додатки з телефона</translation> <translation id="6818802132960437751">Вбудований захист від вірусів</translation> +<translation id="6818920801736417483">Зберігати паролі?</translation> <translation id="6823174134746916417">Функція "Торкнутися, щоб натиснути" на сенсорній панелі</translation> <translation id="6824564591481349393">Копіювати &адресу електронної пошти</translation> <translation id="6824584962142919697">&Перевірити елементи</translation> @@ -6110,7 +6111,6 @@ <translation id="697312151395002334">Дозволено показувати спливаючі вікна та використовувати переспрямування</translation> <translation id="6973611239564315524">Доступне оновлення Debian 10 (Buster)</translation> <translation id="69739764870135975">Якщо Google є вашою пошуковою системою за умовчанням, ви бачитимете кращі та доречніші за контекстом підказки</translation> -<translation id="6974609594866392343">Демо-режим офлайн</translation> <translation id="697508444536771064">Завершити роботу Linux</translation> <translation id="6978121630131642226">Пошукові системи</translation> <translation id="6979044105893951891">Запустити сеанси в режимі "Гість", якими керує адміністратор, і вийти з них</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 2407acd..0d99e7a6 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -4771,7 +4771,6 @@ <translation id="5658415415603568799">اضافی سیکیورٹی کیلئے Smart Lock آپ سے 20 گھنٹے بعد آپ کا پاس ورڈ درج کرنے کا تقاضہ کرے گا۔</translation> <translation id="5659593005791499971">ای میل</translation> <translation id="5659833766619490117">اس صفحہ کا ترجمہ نہیں کیا جا سکا</translation> -<translation id="566097169318652001">ہو سکتا ہے کہ آپ کا آلہ اب ٹھیک سے کام نہ کرے اور آپ کو سیکیورٹی اور کارکردگی کے مسائل کا سامنا کرنا پڑے۔ آپ کی ایپس کی کلیدی خصوصیات بھی پرانی ہو جانے پر کام کرنا بند کر سکتی ہیں اور آپ قانونی دعوے کرنے کا اپنا حق کھو دیں گے۔</translation> <translation id="5662513737565158057">Linux ایپس کے کام کرنے کا طریقہ تبدیل کریں۔</translation> <translation id="5667293444945855280">میلوئیر</translation> <translation id="5667546120811588575">Google Play کو سیٹ کیا جا رہا ہے...</translation> @@ -6090,7 +6089,6 @@ <translation id="697312151395002334">ری ڈائریکٹس استعمال کرنے اور پاپ اپس بھیجنے کی اجازت ہے</translation> <translation id="6973611239564315524">Debian 10 (بسٹر) کے لیے ایک اپ گریڈ دستیاب ہے</translation> <translation id="69739764870135975">اگر Google بھی آپ کا ڈیفالٹ سرچ انجن ہے تو آپ کو بہتر، سیاق و سباق کے لحاظ سے متعلقہ تجاویز دکھائی دیں گی</translation> -<translation id="6974609594866392343">آف لائن ڈیمو وضع</translation> <translation id="697508444536771064">Linux شٹ ڈاؤن کریں</translation> <translation id="6978121630131642226">سرچ انجن</translation> <translation id="6979044105893951891">شروع کریں اور نظم کردہ مہمان سیشنز سے باہر نکلیں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index b4dd7f71..12b3cf9 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -4774,7 +4774,6 @@ <translation id="5658415415603568799">Xavfsizlikni oshirish uchun Smart Lock 20 soatdan keyin parolingizni kiritishni talab qiladi.</translation> <translation id="5659593005791499971">Email</translation> <translation id="5659833766619490117">Bu sahifa tarjima qilinmadi</translation> -<translation id="566097169318652001">Endi qurilmangiz ishlashi, xavfsizlik va unumdorlikda muammolar yuz berishi mumkin. Ilovalar eskirganda ularning asosiy funksiyalari ham ishlamay qolishi mumkin va ular yuzasidan yuridik shikoyat qila olmaysiz.</translation> <translation id="5662513737565158057">Linux ilovalari qanday ishlashini sozlash.</translation> <translation id="5667293444945855280">Zararli dastur</translation> <translation id="5667546120811588575">Google Play sozlanmoqda</translation> @@ -6093,7 +6092,6 @@ <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> -<translation id="6974609594866392343">Oflayn demo rejimi</translation> <translation id="697508444536771064">Linux seansini tamomlash</translation> <translation id="6978121630131642226">Qidiruv tizimlari</translation> <translation id="6979044105893951891">Boshqaruvdagi mehmon seanslariga ruxsat</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index be09023..cdf9bd8 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -884,6 +884,7 @@ <translation id="1823098433522728610">Tài liệu này có nội dung nhạy cảm.</translation> <translation id="18245044880483936">Dữ liệu sao lưu sẽ không tính vào định mức bộ nhớ Drive của con bạn.</translation> <translation id="1825565032302550710">Cổng phải nằm trong khoảng 1024 và 65535</translation> +<translation id="182577151972096764">công thức mới xem gần đây</translation> <translation id="1826192255355608658">Đồng bộ hóa dấu trang, mật khẩu, nhật ký duyệt web trên Chrome, v.v.</translation> <translation id="1826516787628120939">Đang kiểm tra</translation> <translation id="1827738518074806965">Phòng tranh</translation> @@ -1318,6 +1319,7 @@ <translation id="2241053333139545397">Đọc và thay đổi dữ liệu của bạn trên một số trang web</translation> <translation id="2241634353105152135">Chỉ một lần</translation> <translation id="2242687258748107519">Thông tin tệp</translation> +<translation id="2246129643805925002"><ph name="DEVICE_TYPE" /> của bạn tự động cập nhật ở chế độ nền để đem đến cho bạn những cải tiến về khả năng bảo mật và tính năng mới nhất. Bạn có thể xem xét các lựa chọn ưu tiên về bản cập nhật trong phần Cài đặt.</translation> <translation id="2246549592927364792">Lấy nội dung mô tả hình ảnh từ Google?</translation> <translation id="2247738527273549923">Thiết bị do tổ chức của bạn quản lý</translation> <translation id="2249111429176737533">Mở bằng cửa sổ dạng thẻ</translation> @@ -1610,6 +1612,7 @@ <translation id="249113932447298600">Rất tiếc, thiết bị <ph name="DEVICE_LABEL" /> không được hỗ trợ vào thời điểm này.</translation> <translation id="2492461744635776704">Đang chuẩn bị yêu cầu ký chứng chỉ</translation> <translation id="2493126929778606526">Những ảnh đẹp nhất của bạn được chọn tự động</translation> +<translation id="2495524171012645395">Công thức mới xem gần đây</translation> <translation id="2496180316473517155">Lịch sử duyệt web</translation> <translation id="2497229222757901769">Tốc độ chuột</translation> <translation id="2497852260688568942">Quản trị viên của bạn đã tắt tính năng đồng bộ hóa</translation> @@ -3428,6 +3431,7 @@ <translation id="4289732974614035569">Hãy chọn một mã PIN</translation> <translation id="4290791284969893584">Sau khi đóng một trang, các thao tác bạn đã bắt đầu có thể không hoàn tất</translation> <translation id="4291265871880246274">Hộp thoại đăng nhập</translation> +<translation id="429234155571566255">những công thức mới xem này</translation> <translation id="4295072614469448764">Ứng dụng này hiện đã có trong thiết bị của bạn. Ngoài ra, có thể có một biểu tượng trong Trình chạy.</translation> <translation id="4295979599050707005">Vui lòng đăng nhập lại để xác nhận rằng tài khoản <ph name="USER_EMAIL" /> của bạn có thể dùng với các trang web, ứng dụng và tiện ích trong Chrome cũng như Google Play. Bạn cũng có thể xóa tài khoản này. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="4297219207642690536">Khởi động lại và đặt lại</translation> @@ -3488,6 +3492,7 @@ <translation id="435527878592612277">Chọn ảnh của bạn</translation> <translation id="4358302248024731679">Để chẩn đoán chính xác hơn các vấn đề về Bluetooth, nhân viên của Google có thể đưa thêm nhật ký Bluetooth vào báo cáo phản hồi của họ. Khi bạn chọn tuỳ chọn này, báo cáo của bạn sẽ bao gồm cả nhật ký btsnoop và HCI từ phiên hoạt động hiện tại, trong đó đã loại bỏ nhiều thông tin nhận dạng cá nhân nhất có thể. Chỉ người quản lý nhóm sản phẩm ChromeOS trong Listnr mới có quyền truy cập vào các nhật ký này. Nhật ký sẽ bị xoá hoàn toàn sau 90 ngày.</translation> <translation id="4358313196493694334">Ổn định vị trí nhấp</translation> +<translation id="4358643842961018282">Phiên bản trên thiết bị của bạn là phiên bản mới nhất</translation> <translation id="4359408040881008151">Đã được cài đặt vì (các) tiện ích phụ thuộc.</translation> <translation id="4359717112757026264">Cảnh thành phố</translation> <translation id="4361142739114356624">Khóa cá nhân cho chứng chỉ ứng dụng này còn thiếu hoặc không hợp lệ</translation> @@ -4780,7 +4785,6 @@ <translation id="5658415415603568799">Để tăng cường bảo mật, Smart Lock sẽ yêu cầu bạn nhập mật khẩu sau 20 giờ.</translation> <translation id="5659593005791499971">Email</translation> <translation id="5659833766619490117">Không thể dịch trang này</translation> -<translation id="566097169318652001">Thiết bị của bạn có thể sẽ không còn hoạt động bình thường và bạn có thể gặp phải các vấn đề về hiệu suất và bảo mật. Các tính năng chính trong ứng dụng của bạn cũng có thể ngừng hoạt động khi chúng trở nên lỗi thời và bạn sẽ mất quyền đưa ra các khiếu nại pháp lý.</translation> <translation id="5662513737565158057">Thay đổi cách hoạt động của ứng dụng Linux.</translation> <translation id="5667293444945855280">Phần mềm độc hại</translation> <translation id="5667546120811588575">Đang thiết lập Google Play...</translation> @@ -6097,7 +6101,6 @@ <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> -<translation id="6974609594866392343">Chế độ minh họa ngoại tuyến</translation> <translation id="697508444536771064">Tắt Linux</translation> <translation id="6978121630131642226">Công cụ Tìm kiếm</translation> <translation id="6979044105893951891">Chạy và thoát khỏi các phiên khách được quản lý</translation> @@ -7117,6 +7120,7 @@ <translation id="7981313251711023384">Tải trước các trang để tìm kiếm và duyệt web nhanh hơn</translation> <translation id="798145602633458219">Thêm đề xuất <ph name="SUGGESTION_NAME" /> vào hộp tìm kiếm</translation> <translation id="7981662863948574132">Hiện cửa sổ bật lên hiển thị mã QR và số EID của thiết bị</translation> +<translation id="7981670705071137488">Sau khi quá trình này kết thúc, việc cập nhật phần mềm sẽ diễn ra ở chế độ nền. Bạn có thể xem xét các lựa chọn ưu tiên về bản cập nhật trong phần Cài đặt.</translation> <translation id="7982083145464587921">Vui lòng khởi động lại thiết bị của bạn để sửa lỗi này.</translation> <translation id="7982789257301363584">Mạng</translation> <translation id="7984068253310542383">Phản chiếu <ph name="DISPLAY_NAME" /></translation> @@ -7361,6 +7365,7 @@ <translation id="8214489666383623925">Mở Tệp...</translation> <translation id="8215129063232901118">Sử dụng các tính năng của điện thoại trên chiếc <ph name="DEVICE_TYPE" /> của bạn</translation> <translation id="8217399928341212914">Tiếp tục chặn tự động tải nhiều tệp xuống</translation> +<translation id="822050276545350872">Từ đây trở đi, bạn không cần phải chờ đợi nữa</translation> <translation id="8221491193165283816">Bạn thường chặn các thông báo. Để cho phép trang web này thông báo cho bạn, hãy nhấp vào đây.</translation> <translation id="822347941086490485">Đang tìm thiết bị HID...</translation> <translation id="8225046344534779393">Kiểm tra kết nối Internet</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 0d3bb27..99a0037 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -868,6 +868,7 @@ <translation id="1823098433522728610">此文档含有敏感内容。</translation> <translation id="18245044880483936">备份数据不会计入您孩子的云端硬盘存储空间配额。</translation> <translation id="1825565032302550710">端口必须介于 1024 到 65535 之间</translation> +<translation id="182577151972096764">最近查看过的食谱</translation> <translation id="1826192255355608658">同步您的 Chrome 浏览器书签、密码、历史记录等信息</translation> <translation id="1826516787628120939">正在检查</translation> <translation id="1827738518074806965">画廊</translation> @@ -1299,6 +1300,7 @@ <translation id="2241053333139545397">读取和更改您在一些网站上的数据</translation> <translation id="2241634353105152135">仅一次</translation> <translation id="2242687258748107519">文件信息</translation> +<translation id="2246129643805925002">您的 <ph name="DEVICE_TYPE" /> 会自动在后台更新,以便为您提供最新的功能和安全性方面的改进。您可在“设置”中查看更新偏好设置。</translation> <translation id="2246549592927364792">要从 Google 获取图片说明吗?</translation> <translation id="2247738527273549923">您的设备由贵单位管理</translation> <translation id="2249111429176737533">在标签页窗口中打开</translation> @@ -1588,6 +1590,7 @@ <translation id="249113932447298600">抱歉,系统目前不支持设备“<ph name="DEVICE_LABEL" />”。</translation> <translation id="2492461744635776704">正在准备证书签名请求</translation> <translation id="2493126929778606526">您的最佳照片,由系统自动挑选</translation> +<translation id="2495524171012645395">最近查看过的食谱</translation> <translation id="2496180316473517155">浏览记录</translation> <translation id="2497229222757901769">鼠标速度</translation> <translation id="2497852260688568942">您的管理员已停用同步</translation> @@ -3404,6 +3407,7 @@ <translation id="4289732974614035569">选择 PIN 码</translation> <translation id="4290791284969893584">关闭网页后,您已启动的任务可能会无法完成</translation> <translation id="4291265871880246274">登录对话框</translation> +<translation id="429234155571566255">这些最近查看过的食谱</translation> <translation id="4295072614469448764">应用已可在您的终端上使用,且可能在启动器中显示图标。</translation> <translation id="4295979599050707005">请重新登录,以确认您的帐号 (<ph name="USER_EMAIL" />) 可用于 Chrome 和 Google Play 中的网站、应用和扩展程序。您还可以移除此帐号。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="4297219207642690536">重启并重置</translation> @@ -3462,6 +3466,7 @@ <translation id="435527878592612277">选择您的照片</translation> <translation id="4358302248024731679">为了更好地诊断蓝牙问题,Google 用户可以在反馈报告中包含其他蓝牙日志。此选项处于选中状态时,您的报告中将包含来自当前会话的 btsnoop 和 HCI 日志,这些日志经过处理,尽可能移除了个人身份信息。只有 Listnr 的 Chrome 操作系统产品组管理员可以访问这些日志。这些日志将于 90 天后被完全清除。</translation> <translation id="4358313196493694334">稳定点击位置</translation> +<translation id="4358643842961018282">您的设备已更新到最新版本</translation> <translation id="4359408040881008151">安装此扩展程序是因为某个/些扩展程序需要安装它才能正常使用。</translation> <translation id="4359717112757026264">城市景观</translation> <translation id="4361142739114356624">缺少此客户端证书的私钥,或私钥无效</translation> @@ -4752,7 +4757,6 @@ <translation id="5658415415603568799">为了提升安全性,Smart Lock 会在 20 小时后要求您输入您的密码。</translation> <translation id="5659593005791499971">电子邮件</translation> <translation id="5659833766619490117">无法翻译此网页</translation> -<translation id="566097169318652001">您的设备可能会无法继续正常运行,您则可能会遇到安全问题和性能问题。一旦您的应用过期,其中的关键功能可能也会停止运行,而您将失去依法索赔的权利。</translation> <translation id="5662513737565158057">更改 Linux 应用的运行方式。</translation> <translation id="5667293444945855280">恶意软件</translation> <translation id="5667546120811588575">正在设置 Google Play…</translation> @@ -5605,6 +5609,7 @@ <translation id="6520876759015997832">第 <ph name="LIST_POSITION" /> 条搜索结果(共 <ph name="LIST_SIZE" /> 条):<ph name="SEARCH_RESULT_TEXT" />。按 Enter 键即可转到相应部分。</translation> <translation id="6521214596282732365">网站通常会使用您的字体,以便您能够利用在线设计和制图工具创作高保真内容</translation> <translation id="6523303810310758032">如果您删除了浏览记录(无论是全部删除,还是只删除了在特定网站上的浏览记录),关联的衡量信息会一并删除。请参阅<ph name="BEGIN_LINK" />您的浏览记录<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Google 密码管理工具无法将这些密码保存到您的 Google 帐号中。您可以将这些密码保存到此设备上。</translation> <translation id="6524735478670290456">我们会如何使用这些数据:</translation> <translation id="652492607360843641">您已连接到<ph name="NETWORK_TYPE" />网络。</translation> <translation id="6527303717912515753">分享</translation> @@ -5909,6 +5914,7 @@ <translation id="6818198425579322765">要翻译的网页语言</translation> <translation id="6818547713623251698">查看您手机上的照片、媒体内容、通知和应用</translation> <translation id="6818802132960437751">内置病毒防护功能</translation> +<translation id="6818920801736417483">保存密码?</translation> <translation id="6823174134746916417">触控板点按即点击</translation> <translation id="6824564591481349393">复制电子邮件地址(&E)</translation> <translation id="6824584962142919697">检查元素(&I)</translation> @@ -6068,7 +6074,6 @@ <translation id="697312151395002334">允许发送弹出式窗口并使用重定向</translation> <translation id="6973611239564315524">可以升级至 Debian 10 (Buster)</translation> <translation id="69739764870135975">如果 Google 也是您的默认搜索引擎,您将会看到更实用、与上下文更相关的建议</translation> -<translation id="6974609594866392343">离线演示模式</translation> <translation id="697508444536771064">关闭 Linux</translation> <translation id="6978121630131642226">搜索引擎</translation> <translation id="6979044105893951891">启动和退出受管理访客会话</translation> @@ -7087,6 +7092,7 @@ <translation id="7981313251711023384">预加载网页,以便实现更快速的浏览和搜索</translation> <translation id="798145602633458219">将“<ph name="SUGGESTION_NAME" />”这项推荐内容附加到搜索框中</translation> <translation id="7981662863948574132">显示包含设备 EID 和二维码的弹出式窗口</translation> +<translation id="7981670705071137488">之后,软件更新将在后台进行。您可在“设置”中查看更新偏好设置。</translation> <translation id="7982083145464587921">请重新启动您的设备以修复此错误。</translation> <translation id="7982789257301363584">网络</translation> <translation id="7984068253310542383">镜像“<ph name="DISPLAY_NAME" />”</translation> @@ -7331,6 +7337,7 @@ <translation id="8214489666383623925">打开文件...</translation> <translation id="8215129063232901118">通过 <ph name="DEVICE_TYPE" /> 使用手机的功能</translation> <translation id="8217399928341212914">继续阻止自动下载多个文件</translation> +<translation id="822050276545350872">从现在开始,无需再等待</translation> <translation id="8221491193165283816">您通常会屏蔽通知。要允许此网站向您发送通知,请点击此处。</translation> <translation id="822347941086490485">正在查找 HID 设备…</translation> <translation id="8225046344534779393">请检查互联网连接状况</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index c362dce..7a76e90 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -4785,7 +4785,6 @@ <translation id="5658415415603568799">為提高安全性,Smart Lock 將會在 20 小時後要求您輸入密碼。</translation> <translation id="5659593005791499971">電郵</translation> <translation id="5659833766619490117">無法翻譯此網頁的內容</translation> -<translation id="566097169318652001">裝置可能無法再正常運作,您可能會遇到安全性和效能問題。應用程式如果過舊,其重要功能亦可能會停止運作,而您將失去提出法律申索的權利。</translation> <translation id="5662513737565158057">變更 Linux 應用程式的運作方式。</translation> <translation id="5667293444945855280">惡意軟件</translation> <translation id="5667546120811588575">正在設定 Google Play…</translation> @@ -5639,6 +5638,7 @@ <translation id="6520876759015997832"><ph name="LIST_SIZE" /> 項搜尋結果的第 <ph name="LIST_POSITION" /> 項:<ph name="SEARCH_RESULT_TEXT" />。按下 Enter 鍵即可前往該部分。</translation> <translation id="6521214596282732365">為了讓您透過網上的設計及圖像工具建立高傳真度的內容,網站通常會使用您的字型</translation> <translation id="6523303810310758032">刪除瀏覽紀錄時 (包括刪除所有或特定網站),系統亦會刪除關聯的評估資料。請查看<ph name="BEGIN_LINK" />您的瀏覽記錄<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">「Google 密碼管理工具」無法將這些密碼儲存在您的 Google 帳戶中,您可改為儲存至此裝置。</translation> <translation id="6524735478670290456">我們如何使用這些資料:</translation> <translation id="652492607360843641">您已連接<ph name="NETWORK_TYPE" />網絡。</translation> <translation id="6527303717912515753">分享</translation> @@ -5943,6 +5943,7 @@ <translation id="6818198425579322765">要翻譯的網頁語言</translation> <translation id="6818547713623251698">查看手機上的相片、媒體、通知和應用程式</translation> <translation id="6818802132960437751">內置防毒功能</translation> +<translation id="6818920801736417483">要儲存密碼嗎?</translation> <translation id="6823174134746916417">觸控板輕按點撃功能</translation> <translation id="6824564591481349393">複製電郵地址(&E)</translation> <translation id="6824584962142919697">檢查元素 (&I)</translation> @@ -6102,7 +6103,6 @@ <translation id="697312151395002334">已允許傳送彈出式視窗和使用重新導向</translation> <translation id="6973611239564315524">可以升級至 Debian 10 (Buster)</translation> <translation id="69739764870135975">如果 Google 亦是預設的搜尋引擎,您將能取得更實用、更符合需要的建議</translation> -<translation id="6974609594866392343">離線示範模式</translation> <translation id="697508444536771064">關閉 Linux</translation> <translation id="6978121630131642226">搜尋引擎</translation> <translation id="6979044105893951891">啟動及結束受管理的訪客工作階段</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index d207d2d..7916dca8 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -872,6 +872,7 @@ <translation id="1823098433522728610">這份文件含有敏感內容。</translation> <translation id="18245044880483936">備份資料不會計入貴子女的雲端硬碟儲存空間配額。</translation> <translation id="1825565032302550710">連接埠必須介於 1024 與 65535 之間</translation> +<translation id="182577151972096764">最近瀏覽過的食譜</translation> <translation id="1826192255355608658">同步處理 Chrome 瀏覽器的書籤、密碼和歷史記錄等資料</translation> <translation id="1826516787628120939">檢查中</translation> <translation id="1827738518074806965">畫廊</translation> @@ -1305,6 +1306,7 @@ <translation id="2241053333139545397">讀取及變更你在多個網站上的資料</translation> <translation id="2241634353105152135">只有這一次</translation> <translation id="2242687258748107519">檔案資訊</translation> +<translation id="2246129643805925002"><ph name="DEVICE_TYPE" /> 會在背景自動進行更新,為你提供最新功能並改善安全性。你可以前往「設定」查看更新偏好設定。</translation> <translation id="2246549592927364792">要取得 Google 提供的圖片說明嗎?</translation> <translation id="2247738527273549923">這部裝置是由貴機構管理</translation> <translation id="2249111429176737533">在分頁視窗中開啟</translation> @@ -1594,6 +1596,7 @@ <translation id="249113932447298600">很抱歉,系統目前不支援 <ph name="DEVICE_LABEL" /> 裝置。</translation> <translation id="2492461744635776704">正在準備憑證簽署要求</translation> <translation id="2493126929778606526">自動精選最佳相片</translation> +<translation id="2495524171012645395">最近瀏覽過的食譜</translation> <translation id="2496180316473517155">瀏覽記錄</translation> <translation id="2497229222757901769">滑鼠速度</translation> <translation id="2497852260688568942">你的管理員停用了同步功能</translation> @@ -3411,6 +3414,7 @@ <translation id="4289732974614035569">選擇 PIN 碼</translation> <translation id="4290791284969893584">關閉網頁後,你已啟動的工作可能無法完成</translation> <translation id="4291265871880246274">登入對話方塊</translation> +<translation id="429234155571566255">這些最近瀏覽過的食譜</translation> <translation id="4295072614469448764">應用程式已出現在你的終端機上,且可能在啟動器中顯示圖示。</translation> <translation id="4295979599050707005">請再次登入,並確認你的帳戶 (<ph name="USER_EMAIL" />) 可用於 Chrome 和 Google Play 的網站、應用程式與擴充功能。你也可以移除這個帳戶。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="4297219207642690536">重新啟動並重設</translation> @@ -3471,6 +3475,7 @@ <translation id="435527878592612277">請選取你的相片</translation> <translation id="4358302248024731679">為了進一步診斷藍牙問題,Google 員工可在意見回饋報告額外納入藍牙記錄。勾選這個選項後,你的報告就會納入目前工作階段的 btsnoop 和 HCI 記錄。這些記錄會經過處理,盡可能移除個人識別資訊 (PII),且只有 Listnr 的 Chrome OS 產品團隊主管可以存取。系統會在 90 天後清除這些記錄。</translation> <translation id="4358313196493694334">穩定點擊位置</translation> +<translation id="4358643842961018282">你的裝置已更新到最新版本</translation> <translation id="4359408040881008151">你已安裝相依的擴充功能,因此必須一併安裝這個擴充功能。</translation> <translation id="4359717112757026264">城市景觀</translation> <translation id="4361142739114356624">這個用戶端憑證沒有私密金鑰或私密金鑰無效</translation> @@ -4761,7 +4766,6 @@ <translation id="5658415415603568799">為了提升安全性,Smart Lock 會在經過 20 小時後要求您輸入密碼。</translation> <translation id="5659593005791499971">電子郵件</translation> <translation id="5659833766619490117">無法翻譯這個網頁的內容</translation> -<translation id="566097169318652001">裝置可能無法再正常運作,你可能會遇到安全性和效能問題。應用程式版本過舊,可能也會使應用程式的重要功能停止運作,你可能會失去法律請求的權利。</translation> <translation id="5662513737565158057">變更 Linux 應用程式的運作方式。</translation> <translation id="5667293444945855280">惡意程式</translation> <translation id="5667546120811588575">正在設定 Google Play...</translation> @@ -5613,6 +5617,7 @@ <translation id="6520876759015997832">第 <ph name="LIST_POSITION" /> 項搜尋結果,共 <ph name="LIST_SIZE" /> 項:<ph name="SEARCH_RESULT_TEXT" />。按下 Enter 鍵即可前往這個部分。</translation> <translation id="6521214596282732365">網站通常會使用你的字型,方便你透過線上的設計及圖像工具建立具有高度一致性的內容</translation> <translation id="6523303810310758032">如果刪除所有或特定網站的瀏覽記錄,也會一併刪除相關的評估資訊。查看<ph name="BEGIN_LINK" />你的瀏覽記錄<ph name="END_LINK" /></translation> +<translation id="6523574494641144162">Google 密碼管理工具無法將這些密碼儲存在你的 Google 帳戶中,你可以改為儲存至這部裝置。</translation> <translation id="6524735478670290456">Google 如何使用這些資料:</translation> <translation id="652492607360843641">你已連上<ph name="NETWORK_TYPE" />網路。</translation> <translation id="6527303717912515753">分享</translation> @@ -5917,6 +5922,7 @@ <translation id="6818198425579322765">要翻譯的網頁語言</translation> <translation id="6818547713623251698">查看手機上的相片、媒體、通知和應用程式</translation> <translation id="6818802132960437751">內建防毒機制</translation> +<translation id="6818920801736417483">要儲存密碼嗎?</translation> <translation id="6823174134746916417">觸控板點按功能</translation> <translation id="6824564591481349393">複製電子郵件地址(&E)</translation> <translation id="6824584962142919697">檢查元素 (&I)</translation> @@ -6076,7 +6082,6 @@ <translation id="697312151395002334">可以傳送彈出式視窗及使用重新導向</translation> <translation id="6973611239564315524">現在可以升級至 Debian 10 (Buster)</translation> <translation id="69739764870135975">如果 Google 同時也是你的預設搜尋引擎,你將能取得更實用、更符合需求的建議</translation> -<translation id="6974609594866392343">離線示範模式</translation> <translation id="697508444536771064">關閉 Linux</translation> <translation id="6978121630131642226">搜尋引擎</translation> <translation id="6979044105893951891">啟動及結束受管理的訪客工作階段</translation> @@ -7096,6 +7101,7 @@ <translation id="7981313251711023384">預先載入網頁,以加快瀏覽及搜尋速度</translation> <translation id="798145602633458219">將「<ph name="SUGGESTION_NAME" />」這項建議附加到搜尋框內</translation> <translation id="7981662863948574132">顯示裝置 EID 和 QR 圖碼彈出式視窗</translation> +<translation id="7981670705071137488">日後,系統會在背景進行軟體更新作業。你可以前往「設定」查看更新偏好設定。</translation> <translation id="7982083145464587921">請重新啟動裝置以修復這個錯誤。</translation> <translation id="7982789257301363584">網路</translation> <translation id="7984068253310542383">鏡像投射「<ph name="DISPLAY_NAME" />」</translation> @@ -7340,6 +7346,7 @@ <translation id="8214489666383623925">開啟檔案...</translation> <translation id="8215129063232901118">透過 <ph name="DEVICE_TYPE" /> 使用手機上的功能和內容</translation> <translation id="8217399928341212914">繼續禁止自動下載多個檔案</translation> +<translation id="822050276545350872">從此不必再等待</translation> <translation id="8221491193165283816">你通常會封鎖通知。如要允許這個網站傳送通知給你,請按這裡。</translation> <translation id="822347941086490485">正在尋找 HID 裝置…</translation> <translation id="8225046344534779393">檢查網際網路連線</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 91d9d26..ca302cb 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -4790,7 +4790,6 @@ <translation id="5658415415603568799">Ngokuphepha, i-Smart Lock izokucela ukuthi ufake iphasiwedi yakho ngemuva kwamahora angu-20.</translation> <translation id="5659593005791499971">I-imeyili</translation> <translation id="5659833766619490117">Leli khasi alikwazanga ukuhunyushwa</translation> -<translation id="566097169318652001">Idivayisi yakho ingase ingasasebenzi kahle, futhi ungase ube nezinkinga zokuvikeleka nokusebenza. Izakhi ezibalulekile kuma-app akho zingase ziyeke ukusebenza uma seziphelelwe yisikhathi futhi uzolahlekelwa yilungelo lakho lokwenza izimangalo ezingokomthetho.</translation> <translation id="5662513737565158057">Shintsha indlela izinhlelo zokusebenza ze-Linux ezisebenza ngayo.</translation> <translation id="5667293444945855280">I-Malware</translation> <translation id="5667546120811588575">Isetha i-Google Play...</translation> @@ -6109,7 +6108,6 @@ <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> -<translation id="6974609594866392343">Imodi yedemo yokungaxhumekile</translation> <translation id="697508444536771064">Cisha i-Linux</translation> <translation id="6978121630131642226">Izinjini zosesho</translation> <translation id="6979044105893951891">Qalisa futhi uphume izikhathi zesihambeli eziphethwe</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index e9ca56d..4f574dcf 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -287,6 +287,7 @@ Hazırda veb saytlar və tətbiqlərə verdiyiniz icazələr bu hesaba tətbiq oluna bilər. Google Hesablarınızı <ph name="SETTINGS_LINK_BEGIN" />Ayarlarda<ph name="SETTINGS_LINK_END" /> idarə edə bilərsiniz.</translation> <translation id="7398801000654795464">Chrome'a <ph name="USER_EMAIL_ADDRESS" /> olaraq daxil olmuşdunuz. Lütfən, yenidən daxil olmaq üçün eyni hesabdan istifadə edin.</translation> <translation id="7410958280246779049">Chrome bu faylı təhlükəli olduğu üçün blokladı</translation> +<translation id="7426611252293106642">Google Chrome düzgün işləməyə bilər, çünki daha bu Linux sistemi üzərində dəstəklənmir</translation> <translation id="7481213027396403996">Chrome’un ən güclü güvənlik sistemini əldə edin</translation> <translation id="7486227612705979895">Ünvan panelində təkliflər irəli sürmək üçün Chrome Diskinizə daxil olacaq</translation> <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index cb8395d..8925042 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -291,6 +291,7 @@ Permissions that you've already given to websites and apps may apply to this account. You can manage your Google Accounts in <ph name="SETTINGS_LINK_BEGIN" />Settings<ph name="SETTINGS_LINK_END" />.</translation> <translation id="7398801000654795464">You were signed in to Chrome as <ph name="USER_EMAIL_ADDRESS" />. Please use the same account to sign in again.</translation> <translation id="7410958280246779049">Chrome blocked this file because it is dangerous</translation> +<translation id="7426611252293106642">Google Chrome may not function correctly because it is no longer supported on this Linux distribution</translation> <translation id="7481213027396403996">Get Chrome's strongest security</translation> <translation id="7486227612705979895">Chrome will access your Drive to make suggestions in the address bar</translation> <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb index cc3eea60..9e409218 100644 --- a/chrome/app/resources/google_chrome_strings_ka.xtb +++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -290,6 +290,7 @@ ამ ანგარიშზე, შესაძლოა, ვრცელდებოდეს ნებართვები, რომლებიც უკვე მიანიჭეთ ვებსაიტებსა და აპებს. თქვენი Google ანგარიშების მართვა შეგიძლიათ <ph name="SETTINGS_LINK_BEGIN" />პარამეტრებიდან<ph name="SETTINGS_LINK_END" />.</translation> <translation id="7398801000654795464">თქვენ შესული ხართ Chrome ში როგორც <ph name="USER_EMAIL_ADDRESS" />. შემდეგი შესვლისთვისაც გთხოვთ იგივე ანგარიში გამოიყენოთ.</translation> <translation id="7410958280246779049">Chrome-მა დაბლოკა ეს ფაილი, რადგან ის სახიფათოა</translation> +<translation id="7426611252293106642">Google Chrome-მა შეიძლება არასწორად იმუშაოს, რადგან ის აღარ არის მხარდაჭერილი ამ Linux დისტრიბუტივზე</translation> <translation id="7481213027396403996">ისარგებლეთ Chrome-ის უსაფრთხოების ყველაზე ძლიერი ფუნქციებით</translation> <translation id="7486227612705979895">Chrome-ს ექნება წვდომა თქვენს Drive-ზე მისამართთა ზოლში შემოთავაზებების უზრუნველსაყოფად</translation> <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index bfe0aba..618b796 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -292,6 +292,7 @@ ການອະນຸຍາດທີ່ທ່ານໄດ້ມອບໃຫ້ເວັບໄຊ ແລະ ແອັບຕ່າງໆໄປກ່ອນແລ້ວອາດມີຜົນກັບບັນຊີນີ້ນຳ. ທ່ານສາມາດຈັດການບັນຊີ Google ຂອງທ່ານໄດ້ໃນ <ph name="SETTINGS_LINK_BEGIN" />ການຕັ້ງຄ່າ<ph name="SETTINGS_LINK_END" />.</translation> <translation id="7398801000654795464">ທ່ານໄດ້ລົງຊື່ເຂົ້າໃຊ້ Chrome ເປັນ <ph name="USER_EMAIL_ADDRESS" />. ກະລຸນາໃຊ້ບັນຊີດຽວກັນ ເພື່ອລົງຊື່ເຂົ້າໃຊ້ອີກ.</translation> <translation id="7410958280246779049">Chrome ບລັອກໄຟລ໌ນີ້ເນື່ອງຈາກມັນເປັນອັນຕະລາຍ</translation> +<translation id="7426611252293106642">Chromium ອາດເຮັດວຽກໄດ້ບໍ່ຖືກຕ້ອງເນື່ອງຈາກ Linux distribution ນີ້ບໍ່ຮອງຮັບມັນອີກຕໍ່ໄປແລ້ວ</translation> <translation id="7481213027396403996">ໃຊ້ຄວາມປອດໄພຂັ້ນສູງສຸດຂອງ Chromium</translation> <translation id="7486227612705979895">Chrome ຈະເຂົ້າເຖິງ Drive ຂອງທ່ານເພື່ອໃຫ້ຄຳແນະນຳໃນແຖບທີ່ຢູ່</translation> <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index f53a403..5cd8c80 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -292,6 +292,7 @@ Leidimai, kuriuos jau esate suteikę svetainėms ir programoms, gali būti taikomi šiai paskyrai. Galite tvarkyti „Google“ paskyras skiltyje <ph name="SETTINGS_LINK_BEGIN" />„Nustatymai“<ph name="SETTINGS_LINK_END" />.</translation> <translation id="7398801000654795464">Buvote prisijungę prie „Chrome“ kaip <ph name="USER_EMAIL_ADDRESS" />. Prisijungdami vėl naudokite tą pačią paskyrą.</translation> <translation id="7410958280246779049">„Chrome“ užblokavo šį failą, nes jis pavojingas</translation> +<translation id="7426611252293106642">„Google Chrome“ gali tinkamai neveikti, nes ji nebepalaikoma naudojant šią „Linux“ versiją</translation> <translation id="7481213027396403996">Patikimiausios „Chrome“ saugos užtikrinimas</translation> <translation id="7486227612705979895">„Chrome“ turės prieigą prie Disko, kad galėtų teikti pasiūlymus adreso juostoje</translation> <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb index 431af293..25d1afbf 100644 --- a/chrome/app/resources/google_chrome_strings_mn.xtb +++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -292,6 +292,7 @@ Таны вебсайтууд болон аппуудад аль хэдийн өгсөн зөвшөөрөл нь энэ бүртгэлд хэрэгжиж болзошгүй. Та Google Бүртгэлүүдээ <ph name="SETTINGS_LINK_BEGIN" />Тохиргоо<ph name="SETTINGS_LINK_END" /> хэсэгт удирдах боломжтой.</translation> <translation id="7398801000654795464">Та <ph name="USER_EMAIL_ADDRESS" /> нэрээр Chrome-д нэвтэрсэн байна. Та дараа дахин нэвтрэхдээ ижил хаяг ашиглан нэвтэрнэ үү.</translation> <translation id="7410958280246779049">Энэ файл аюултай тул Chrome үүнийг блоклосон</translation> +<translation id="7426611252293106642">Үүнийг Linux дистрибьютер дээр цаашид дэмжихгүй тул Google Chrome буруу ажиллаж болзошгүй</translation> <translation id="7481213027396403996">Chrome-н хамгийн хүчирхэг аюулгүй байдлыг аваарай</translation> <translation id="7486227612705979895">Chrome хаяг оруулах хэсэгт зөвлөмж харуулахын тулд таны Драйвт хандах болно</translation> <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc index 4e57bf7..99748412 100644 --- a/chrome/browser/ash/crosapi/browser_manager.cc +++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -75,6 +75,7 @@ #include "components/policy/core/common/cloud/cloud_policy_core.h" #include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h" #include "components/policy/core/common/cloud/cloud_policy_store.h" +#include "components/policy/core/common/values_util.h" #include "components/policy/proto/device_management_backend.pb.h" #include "components/prefs/pref_service.h" #include "components/session_manager/core/session_manager.h" @@ -1209,11 +1210,13 @@ } void BrowserManager::OnComponentPolicyUpdated( - const policy::ComponentCloudPolicyServiceObserver::ComponentPolicyMap& - serialized_policy) { - environment_provider_->SetDeviceAccountComponentPolicy(serialized_policy); - if (browser_service_.has_value()) - browser_service_->service->UpdateComponentPolicy(serialized_policy); + const policy::ComponentPolicyMap& component_policy) { + environment_provider_->SetDeviceAccountComponentPolicy( + policy::CopyComponentPolicyMap(component_policy)); + if (browser_service_.has_value()) { + browser_service_->service->UpdateComponentPolicy( + policy::CopyComponentPolicyMap(component_policy)); + } } void BrowserManager::OnComponentPolicyServiceDestruction(
diff --git a/chrome/browser/ash/crosapi/browser_manager.h b/chrome/browser/ash/crosapi/browser_manager.h index b05c45c7..1a56a473 100644 --- a/chrome/browser/ash/crosapi/browser_manager.h +++ b/chrome/browser/ash/crosapi/browser_manager.h
@@ -32,6 +32,7 @@ #include "components/policy/core/common/cloud/cloud_policy_store.h" #include "components/policy/core/common/cloud/component_cloud_policy_service_observer.h" #include "components/policy/core/common/policy_namespace.h" +#include "components/policy/core/common/values_util.h" #include "components/session_manager/core/session_manager_observer.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -474,12 +475,11 @@ void OnStoreDestruction(policy::CloudPolicyStore* store) override; // policy::ComponentCloudPolicyService::Observer: - // Updates the component policy for given namespace. The policy blob is - // serialized PolicyFetchResponse received from the server, or parsed from the - // file after is was validated. + // Updates the component policy for given namespace. The policy blob is JSON + // value received from the server, or parsed from the file after is was + // validated. void OnComponentPolicyUpdated( - const policy::ComponentCloudPolicyServiceObserver::ComponentPolicyMap& - serialized_policy) override; + const policy::ComponentPolicyMap& component_policy) override; void OnComponentPolicyServiceDestruction( policy::ComponentCloudPolicyService* service) override;
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc index b633bf0..459df18 100644 --- a/chrome/browser/ash/crosapi/crosapi_util.cc +++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -91,6 +91,7 @@ #include "components/metrics/metrics_pref_names.h" #include "components/metrics/metrics_service.h" #include "components/metrics_services_manager/metrics_services_manager.h" +#include "components/policy/core/common/values_util.h" #include "components/policy/policy_constants.h" #include "components/prefs/pref_service.h" #include "components/ukm/ukm_service.h" @@ -103,8 +104,6 @@ #include "services/media_session/public/mojom/media_controller.mojom.h" using MojoOptionalBool = crosapi::mojom::DeviceSettings::OptionalBool; -using MojoPolicyMap = - base::flat_map<::policy::PolicyNamespace, std::vector<uint8_t>>; namespace crosapi { namespace browser_util { @@ -133,15 +132,15 @@ } // Returns the map containing component policy for each namespace. The values -// represent the serialized policy blob for the namespace. -const absl::optional<MojoPolicyMap> GetDeviceAccountComponentPolicy( +// represent the JSON policy for the namespace. +absl::optional<policy::ComponentPolicyMap> GetDeviceAccountComponentPolicy( EnvironmentProvider* environment_provider) { - const MojoPolicyMap& map = + const policy::ComponentPolicyMap& map = environment_provider->GetDeviceAccountComponentPolicy(); if (map.empty()) return absl::nullopt; - return map; + return policy::CopyComponentPolicyMap(map); } // Returns the device specific data needed for Lacros.
diff --git a/chrome/browser/ash/crosapi/environment_provider.cc b/chrome/browser/ash/crosapi/environment_provider.cc index 658fa7e7..92128cee 100644 --- a/chrome/browser/ash/crosapi/environment_provider.cc +++ b/chrome/browser/ash/crosapi/environment_provider.cc
@@ -182,12 +182,13 @@ return device_account_policy_blob_; } -const MojoPolicyMap& EnvironmentProvider::GetDeviceAccountComponentPolicy() { +const policy::ComponentPolicyMap& +EnvironmentProvider::GetDeviceAccountComponentPolicy() { return component_policy_; } void EnvironmentProvider::SetDeviceAccountComponentPolicy( - MojoPolicyMap component_policy) { + policy::ComponentPolicyMap component_policy) { component_policy_ = std::move(component_policy); }
diff --git a/chrome/browser/ash/crosapi/environment_provider.h b/chrome/browser/ash/crosapi/environment_provider.h index f1fd260..a3bb5d8 100644 --- a/chrome/browser/ash/crosapi/environment_provider.h +++ b/chrome/browser/ash/crosapi/environment_provider.h
@@ -10,13 +10,11 @@ #include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "components/account_manager_core/account.h" #include "components/policy/core/common/policy_namespace.h" +#include "components/policy/core/common/values_util.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace crosapi { -using MojoPolicyMap = - base::flat_map<::policy::PolicyNamespace, std::vector<uint8_t>>; - // Provides ash-chrome specific flags/configurations (like session type). class EnvironmentProvider { public: @@ -51,14 +49,14 @@ virtual void SetDeviceAccountPolicy(const std::string& policy_blob); // Getter and updater of the component policy for given namespace. The policy - // blob is serialized PolicyFetchResponse received from the server, or parsed - // from the file after is was validated. - const MojoPolicyMap& GetDeviceAccountComponentPolicy(); + // blob is serialized JSON received from the server, or parsed from the file + // after is was validated. + const policy::ComponentPolicyMap& GetDeviceAccountComponentPolicy(); - // Updates the component policy for given namespace. The policy blob is - // serialized PolicyFetchResponse received from the server, or parsed from the - // file after is was validated. - void SetDeviceAccountComponentPolicy(MojoPolicyMap serialized_policy); + // Updates the component policy for given namespace. The policy value is JSON + // received from the server, or parsed from the file after is was validated. + void SetDeviceAccountComponentPolicy( + policy::ComponentPolicyMap component_policy); // Getter and setter for last device policy fetch attempt timestamp. virtual base::Time GetLastPolicyFetchAttemptTimestamp(); @@ -70,8 +68,8 @@ std::string device_account_policy_blob_; // The component policy to be passed to Lacros. The map value is the - // serialized policy blob. - MojoPolicyMap component_policy_; + // JSON corresponding to the policy for namespace. + policy::ComponentPolicyMap component_policy_; // The last timestamp at which device account policy fetch was attempted. base::Time last_policy_fetch_attempt_;
diff --git a/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc b/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc index a1a0843..9fff7bd34 100644 --- a/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc +++ b/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc
@@ -67,6 +67,10 @@ void REMOVED_2(crosapi::mojom::BrowserInitParamsPtr) override { NOTIMPLEMENTED(); } + void REMOVED_16( + base::flat_map<policy::PolicyNamespace, std::vector<uint8_t>>) override { + NOTIMPLEMENTED(); + } void NewWindow(bool incognito, bool should_trigger_session_restore, @@ -92,8 +96,7 @@ void UpdateKeepAlive(bool enabled) override {} void OpenForFullRestore() override {} void UpdateComponentPolicy( - base::flat_map<policy::PolicyNamespace, std::vector<uint8_t>> policy) - override {} + base::flat_map<policy::PolicyNamespace, base::Value> policy) override {} private: mojo::Receiver<mojom::BrowserService> receiver_;
diff --git a/chrome/browser/ash/crostini/ansible/OWNERS b/chrome/browser/ash/crostini/ansible/OWNERS index 4b816ff..0d2669e 100644 --- a/chrome/browser/ash/crostini/ansible/OWNERS +++ b/chrome/browser/ash/crostini/ansible/OWNERS
@@ -1,2 +1 @@ -aoldemeier@chromium.org okalitova@chromium.org
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc index 5d32bceb..aa69d6b 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -1446,6 +1446,7 @@ TestCase("hideCurrentDirectoryByTogglingHiddenAndroidFolders"), TestCase("newFolderInDownloads"), TestCase("showSendFeedbackAction"), + TestCase("showSendFeedbackAction").FilesSwa(), TestCase("enableDisableStorageSettingsLink"), TestCase("showAvailableStorageMyFiles"), // Disabled until Drive quota can be properly displayed.
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc index 6e7367f0..b91410a 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
@@ -2295,7 +2295,7 @@ } } - if (name == "getActiveTabURL") { + if (name == "getLastActiveTabURL") { BrowserList* browser_list = BrowserList::GetInstance(); Browser* browser = browser_list->GetLastActive(); if (!browser) { @@ -2307,6 +2307,20 @@ return; } + if (name == "expectWindowURL") { + const std::string* expected_url = value.FindStringKey("expectedUrl"); + EXPECT_TRUE(expected_url); + for (auto* web_contents : GetAllWebContents()) { + const std::string& url = web_contents->GetVisibleURL().spec(); + if (url == *expected_url) { + *output = "true"; + return; + } + } + *output = "false"; + return; + } + if (name == "callSwaTestMessageListener") { // Handles equivallent of remoteCall.callRemoteTestUtil for Files.app. By // default Files SWA does not allow extenrnal callers to connect to it and
diff --git a/chrome/browser/ash/login/app_mode/kiosk_launch_controller.cc b/chrome/browser/ash/login/app_mode/kiosk_launch_controller.cc index 99c49b47..7c2ae6d 100644 --- a/chrome/browser/ash/login/app_mode/kiosk_launch_controller.cc +++ b/chrome/browser/ash/login/app_mode/kiosk_launch_controller.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "ash/public/cpp/login_accelerators.h" #include "base/callback.h" #include "base/callback_helpers.h" #include "base/metrics/histogram_functions.h" @@ -257,6 +258,20 @@ profile_load_failed_observers_.RemoveObserver(observer); } +bool KioskLaunchController::HandleAccelerator(LoginAcceleratorAction action) { + if (action == LoginAcceleratorAction::kAppLaunchBailout) { + OnCancelAppLaunch(); + return true; + } + + if (action == LoginAcceleratorAction::kAppLaunchNetworkConfig) { + OnNetworkConfigRequested(); + return true; + } + + return false; +} + void KioskLaunchController::OnProfileLoaded(Profile* profile) { SYSLOG(INFO) << "Profile loaded... Starting app launch."; profile_ = profile;
diff --git a/chrome/browser/ash/login/app_mode/kiosk_launch_controller.h b/chrome/browser/ash/login/app_mode/kiosk_launch_controller.h index 3d22d4d..3d0fd94 100644 --- a/chrome/browser/ash/login/app_mode/kiosk_launch_controller.h +++ b/chrome/browser/ash/login/app_mode/kiosk_launch_controller.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_ASH_LOGIN_APP_MODE_KIOSK_LAUNCH_CONTROLLER_H_ #define CHROME_BROWSER_ASH_LOGIN_APP_MODE_KIOSK_LAUNCH_CONTROLLER_H_ +#include "ash/public/cpp/login_accelerators.h" #include "base/observer_list.h" #include "base/observer_list_types.h" #include "base/time/time.h" @@ -110,6 +111,8 @@ void RemoveKioskProfileLoadFailedObserver( KioskProfileLoadFailedObserver* observer); + bool HandleAccelerator(LoginAcceleratorAction action); + private: friend class KioskLaunchControllerTest; @@ -131,11 +134,12 @@ KioskLaunchController(); + void OnCancelAppLaunch(); + void OnNetworkConfigRequested(); + // AppLaunchSplashScreenView::Delegate: void OnConfigureNetwork() override; - void OnCancelAppLaunch() override; void OnDeletingSplashScreenView() override; - void OnNetworkConfigRequested() override; void OnNetworkConfigFinished() override; void OnNetworkStateChanged(bool online) override; KioskAppManagerBase::App GetAppData() override;
diff --git a/chrome/browser/ash/login/app_mode/test/kiosk_launch_controller_browsertest.cc b/chrome/browser/ash/login/app_mode/test/kiosk_launch_controller_browsertest.cc index f7509b53..f2f2e23 100644 --- a/chrome/browser/ash/login/app_mode/test/kiosk_launch_controller_browsertest.cc +++ b/chrome/browser/ash/login/app_mode/test/kiosk_launch_controller_browsertest.cc
@@ -138,6 +138,8 @@ ->OnNetworkStateChanged(online); } + void OnNetworkConfigRequested() { controller()->OnNetworkConfigRequested(); } + Profile* profile() { return browser()->profile(); } FakeAppLaunchSplashScreenHandler* view() { return view_.get(); } @@ -226,7 +228,7 @@ ExpectState(AppState::kCreatingProfile, NetworkUIState::kNotShowing); // User presses the hotkey. - view_controls()->OnNetworkConfigRequested(); + OnNetworkConfigRequested(); ExpectState(AppState::kCreatingProfile, NetworkUIState::kNeedToShow); EXPECT_CALL(*launcher(), Initialize()).Times(1); @@ -275,7 +277,7 @@ // User presses the hotkey, current installation is canceled. EXPECT_CALL(*launcher(), RestartLauncher()).Times(1); - view_controls()->OnNetworkConfigRequested(); + OnNetworkConfigRequested(); // Launcher restart causes network to be requested again. launch_controls()->InitializeNetwork(); ExpectState(AppState::kInitNetwork, NetworkUIState::kShowing);
diff --git a/chrome/browser/ash/login/existing_user_controller.cc b/chrome/browser/ash/login/existing_user_controller.cc index 52eaef26..dd54c21d 100644 --- a/chrome/browser/ash/login/existing_user_controller.cc +++ b/chrome/browser/ash/login/existing_user_controller.cc
@@ -436,13 +436,6 @@ cros_settings_->GetBoolean(kAccountsPrefShowUserNamesOnSignIn, &show_users_on_signin); - GetLoginDisplayHost()->metrics_recorder()->OnShowUsersOnSignin( - show_users_on_signin); - bool enable_ephemeral_users; - cros_settings_->GetBoolean(kAccountsPrefEphemeralUsersEnabled, - &enable_ephemeral_users); - GetLoginDisplayHost()->metrics_recorder()->OnEnableEphemeralUsers( - enable_ephemeral_users); user_manager::UserManager* const user_manager = user_manager::UserManager::Get(); // By default disable offline login from the error screen. @@ -473,7 +466,6 @@ // Records total number of users on the login screen. base::UmaHistogramCounts100("Login.NumberOfUsersOnLoginScreen", regular_users_counter); - GetLoginDisplayHost()->metrics_recorder()->OnUserCount(regular_users_counter); auto login_users = ExtractLoginUsers(users);
diff --git a/chrome/browser/ash/login/login_pref_names.cc b/chrome/browser/ash/login/login_pref_names.cc index 9dd10c9..f8475461 100644 --- a/chrome/browser/ash/login/login_pref_names.cc +++ b/chrome/browser/ash/login/login_pref_names.cc
@@ -41,6 +41,11 @@ // from PrefService::SetTime(). const char kGaiaLastOnlineSignInTime[] = "gaia.last_online_sign_in_time"; +// Indicates that consolidated consent screen was shown. Used to show new terms +// for reven board users after update from CloudReady to Flex. +const char kRevenOobeConsolidatedConsentAccepted[] = + "RevenOobeConsolidatedConsentAccepted"; + // Indicates the amount of time for which a user authenticated via SAML can use // offline authentication against a cached password before being forced to go // through online authentication against GAIA again. The time is expressed in @@ -115,5 +120,8 @@ // consent for the session. const char kOobeGuestAcceptedTos[] = "oobe.guest_accepted_tos"; +// Indicates that the reven board was updated from CloudReady to Flex. +const char kOobeRevenUpdatedToFlex[] = "OobeRevenUpdatedToFlex"; + } // namespace prefs } // namespace ash
diff --git a/chrome/browser/ash/login/login_pref_names.h b/chrome/browser/ash/login/login_pref_names.h index 3f9b295..2a74e473 100644 --- a/chrome/browser/ash/login/login_pref_names.h +++ b/chrome/browser/ash/login/login_pref_names.h
@@ -13,6 +13,9 @@ extern const char kOobeOnboardingTime[]; extern const char kOobeMarketingOptInScreenFinished[]; extern const char kOobeMarketingOptInChoice[]; +// TODO(https://crbug.com/1322394): deprecate this pref once update from +// CloudReady won't be availble anymore. +extern const char kOobeRevenUpdatedToFlex[]; extern const char kOobeScreenPending[]; extern const char kGaiaOfflineSigninTimeLimitDays[]; extern const char kGaiaLastOnlineSignInTime[]; @@ -27,6 +30,9 @@ extern const char kActivityTimeAfterOnboarding[]; extern const char kOobeGuestMetricsEnabled[]; extern const char kOobeGuestAcceptedTos[]; +// TODO(https://crbug.com/1322394): deprecate this pref once update from +// CloudReady won't be availble anymore. +extern const char kRevenOobeConsolidatedConsentAccepted[]; } // namespace prefs } // namespace ash
diff --git a/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc b/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc index f89d86a..a97587e 100644 --- a/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc +++ b/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc
@@ -9,6 +9,7 @@ #include "ash/public/cpp/session/session_controller.h" #include "base/strings/utf_string_conversions.h" #include "base/test/task_environment.h" +#include "build/build_config.h" #include "chrome/browser/ash/login/login_pref_names.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/browser_process.h" @@ -113,7 +114,8 @@ } // Timing out on ASan LSan: http://crbug.com/1306035. -#if defined(ADDRESS_SANITIZER) && defined(LEAK_SANITIZER) +// Timing out on debug bot: http://crbug.com/1322461 +#if (defined(ADDRESS_SANITIZER) && defined(LEAK_SANITIZER)) || !defined(NDEBUG) #define MAYBE_MaybeShow_WillNotExpire DISABLED_MaybeShow_WillNotExpire #else #define MAYBE_MaybeShow_WillNotExpire MaybeShow_WillNotExpire @@ -160,7 +162,8 @@ } // Timing out on ASan LSan: http://crbug.com/1306035. -#if defined(ADDRESS_SANITIZER) && defined(LEAK_SANITIZER) +// Timing out on debug bot: http://crbug.com/1322461 +#if (defined(ADDRESS_SANITIZER) && defined(LEAK_SANITIZER)) || !defined(NDEBUG) #define MAYBE_MaybeShow_DeleteExpirationTime \ DISABLED_MaybeShow_DeleteExpirationTime #else @@ -181,7 +184,8 @@ } // Timing out on ASan LSan: http://crbug.com/1306035. -#if defined(ADDRESS_SANITIZER) && defined(LEAK_SANITIZER) +// Timing out on debug bot: http://crbug.com/1322461 +#if (defined(ADDRESS_SANITIZER) && defined(LEAK_SANITIZER)) || !defined(NDEBUG) #define MAYBE_MaybeShow_PasswordChanged DISABLED_MaybeShow_PasswordChanged #else #define MAYBE_MaybeShow_PasswordChanged MaybeShow_PasswordChanged
diff --git a/chrome/browser/ash/login/screens/consolidated_consent_screen.cc b/chrome/browser/ash/login/screens/consolidated_consent_screen.cc index 526a2f2..dffcc2d8 100644 --- a/chrome/browser/ash/login/screens/consolidated_consent_screen.cc +++ b/chrome/browser/ash/login/screens/consolidated_consent_screen.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/ash/arc/optin/arc_optin_preference_handler.h" #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h" +#include "chrome/browser/ash/login/login_pref_names.h" #include "chrome/browser/ash/login/startup_utils.h" #include "chrome/browser/ash/login/ui/login_display_host.h" #include "chrome/browser/ash/login/wizard_context.h" @@ -226,12 +227,20 @@ void ConsolidatedConsentScreen::OnOwnershipStatusCheckDone( DeviceSettingsService::OwnershipStatus status) { // If no ownership is established yet, then the current user is the first - // user to sign in. Therefore, the current user would be the owner. + // user to sign in. Therefore, the current user would be the owner if the + // device is not enterprise managed. + policy::BrowserPolicyConnectorAsh* policy_connector = + g_browser_process->platform_part()->browser_policy_connector_ash(); + bool is_managed = policy_connector->IsDeviceEnterpriseManaged(); if (status == DeviceSettingsService::OWNERSHIP_NONE) - is_owner_ = true; + is_owner_ = !is_managed; else if (status == DeviceSettingsService::OWNERSHIP_TAKEN) is_owner_ = user_manager::UserManager::Get()->IsCurrentUserOwner(); + // Save this value for future reuse in the wizard flow. Note: it might remain + // unset. + context()->is_owner_flow = is_owner_; + // If the user is not the owner and the owner disabled metrics, the user // is not allowed to update the usage opt-in. if (!is_owner_.value_or(false) && @@ -261,10 +270,6 @@ // Since ARC OOBE Negotiation is not needed, we should avoid using // ArcOptInPreferenceHandler, so, we should update the usage opt-in here // since OnMetricsModeChanged() will not be called. - policy::BrowserPolicyConnectorAsh* policy_connector = - g_browser_process->platform_part()->browser_policy_connector_ash(); - bool is_managed = policy_connector->IsDeviceEnterpriseManaged(); - auto* metrics_service = g_browser_process->metrics_service(); bool is_enabled = false; if (metrics_service && @@ -404,6 +409,10 @@ WizardController::default_controller()->demo_setup_controller(); if (!demo_setup_controller) { + if (switches::IsRevenBranding()) { + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetBoolean(prefs::kRevenOobeConsolidatedConsentAccepted, true); + } exit_callback_.Run(Result::ACCEPTED); return; }
diff --git a/chrome/browser/ash/login/screens/hardware_data_collection_screen.cc b/chrome/browser/ash/login/screens/hardware_data_collection_screen.cc index 3d515aa4..194b1db 100644 --- a/chrome/browser/ash/login/screens/hardware_data_collection_screen.cc +++ b/chrome/browser/ash/login/screens/hardware_data_collection_screen.cc
@@ -68,15 +68,26 @@ } bool HWDataCollectionScreen::MaybeSkip(WizardContext* context) { - policy::BrowserPolicyConnectorAsh* connector = - g_browser_process->platform_part()->browser_policy_connector_ash(); + if (!switches::IsRevenBranding() || !context->is_branded_build) { + exit_callback_.Run(Result::NOT_APPLICABLE); + return true; + } + bool is_owner = false; // Taking device ownership can take some time, so we can't rely on it here. - // Check that the user is first and not managed instead. - const bool is_owner = - (user_manager::UserManager::Get()->GetUsers().size() == 1); - const bool is_enterprise_managed = connector->IsDeviceEnterpriseManaged(); - if (!switches::IsRevenBranding() || is_enterprise_managed || !is_owner || - !context->is_branded_build) { + // However it can be already checked during ConsolidateConsentScreen. + if (context->is_owner_flow.has_value()) { + is_owner = context->is_owner_flow.value(); + } else { + // If no, check that the device is not managed and user is either already + // marked as an owner in user_manager or is the first on the device. + policy::BrowserPolicyConnectorAsh* connector = + g_browser_process->platform_part()->browser_policy_connector_ash(); + auto* user_manager = user_manager::UserManager::Get(); + is_owner = !connector->IsDeviceEnterpriseManaged() && + (user_manager->IsCurrentUserOwner() || + user_manager->GetUsers().size() == 1); + } + if (!is_owner) { exit_callback_.Run(Result::NOT_APPLICABLE); return true; }
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc index 4f3b35a..3834ae29 100644 --- a/chrome/browser/ash/login/session/user_session_manager.cc +++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -96,6 +96,7 @@ #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/about_flags.h" #include "chrome/browser/ash/settings/cros_settings.h" +#include "chrome/browser/ash/settings/device_settings_service.h" #include "chrome/browser/ash/sync/os_sync_util.h" #include "chrome/browser/ash/tether/tether_service.h" #include "chrome/browser/ash/tpm_firmware_update_notification.h" @@ -445,6 +446,62 @@ } } +bool IsHwDataUsageDeviceSettingSet() { + return DeviceSettingsService::Get() && + DeviceSettingsService::Get()->device_settings() && + DeviceSettingsService::Get() + ->device_settings() + ->has_hardware_data_usage_enabled(); +} + +// Updates local_state kOobeRevenUpdatedToFlex pref to true if OS was updated. +// Returns value of the kOobeRevenUpdatedToFlex pref. +bool IsRevenUpdatedToFlex() { + PrefService* local_state = g_browser_process->local_state(); + if (local_state->GetBoolean(prefs::kOobeRevenUpdatedToFlex)) + return true; + + // If it is a first login after update from CloudReady this field in the + // device settings service won't be set. + bool is_hw_data_usage_enabled_already_set = IsHwDataUsageDeviceSettingSet(); + + // If this field isn't set it means that the device was updated to Flex + // and owner hasn't logged in yet. Set a boolean flag to control if the + // new terms should be shown for existing users on the device. + if (!is_hw_data_usage_enabled_already_set && + features::IsOobeConsolidatedConsentEnabled()) { + local_state->SetBoolean(prefs::kOobeRevenUpdatedToFlex, true); + } + return local_state->GetBoolean(prefs::kOobeRevenUpdatedToFlex); +} + +bool MaybeShowNewTermsAfterUpdateToFlex(Profile* profile) { + // Check if the device has been recently updated from CloudReady to show new + // license agreement and data collection consent. This applies only for + // existing users of not managed reven boards. + policy::BrowserPolicyConnectorAsh* connector = + g_browser_process->platform_part()->browser_policy_connector_ash(); + user_manager::UserManager* user_manager = user_manager::UserManager::Get(); + bool is_device_managed = connector->IsDeviceEnterpriseManaged(); + if (!switches::IsRevenBranding() || user_manager->IsCurrentUserNew() || + is_device_managed) { + return false; + } + if (!IsRevenUpdatedToFlex()) + return false; + const bool should_show_new_terms = + (user_manager->IsCurrentUserOwner() && + !IsHwDataUsageDeviceSettingSet()) || + (features::IsOobeConsolidatedConsentEnabled() && + !profile->GetPrefs()->GetBoolean( + prefs::kRevenOobeConsolidatedConsentAccepted)); + if (should_show_new_terms) { + LoginDisplayHost::default_host()->GetSigninUI()->ShowNewTermsForFlexUsers(); + return true; + } + return false; +} + } // namespace UserSessionManagerDelegate::~UserSessionManagerDelegate() {} @@ -1818,6 +1875,9 @@ ->StartManagementTransition(); return false; } + if (MaybeShowNewTermsAfterUpdateToFlex(profile)) { + return false; + } if (features::IsManagedTermsOfServiceEnabled() && !user_manager->IsCurrentUserNew() && profile->GetPrefs()->IsManagedPreference(::prefs::kTermsOfServiceURL)) {
diff --git a/chrome/browser/ash/login/startup_utils.cc b/chrome/browser/ash/login/startup_utils.cc index 52895f2..f556bf3 100644 --- a/chrome/browser/ash/login/startup_utils.cc +++ b/chrome/browser/ash/login/startup_utils.cc
@@ -7,6 +7,8 @@ #include <utility> #include "ash/components/arc/arc_prefs.h" +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/callback.h" #include "base/command_line.h" @@ -101,6 +103,9 @@ registry->RegisterBooleanPref(kDisableHIDDetectionScreenForTests, false); registry->RegisterBooleanPref(prefs::kOobeGuestMetricsEnabled, false); registry->RegisterBooleanPref(prefs::kOobeGuestAcceptedTos, false); + if (switches::IsRevenBranding()) { + registry->RegisterBooleanPref(prefs::kOobeRevenUpdatedToFlex, false); + } } // static @@ -119,6 +124,11 @@ // initialized along with `kOobeOnboardingTime`. registry->RegisterBooleanPref( arc::prefs::kArcPlayStoreLaunchMetricCanBeRecorded, false); + if (switches::IsRevenBranding() && + features::IsOobeConsolidatedConsentEnabled()) { + registry->RegisterBooleanPref(prefs::kRevenOobeConsolidatedConsentAccepted, + false); + } OnboardingUserActivityCounter::RegisterProfilePrefs(registry); }
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.cc b/chrome/browser/ash/login/ui/login_display_host_common.cc index b609caa..d9a02746a 100644 --- a/chrome/browser/ash/login/ui/login_display_host_common.cc +++ b/chrome/browser/ash/login/ui/login_display_host_common.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ash/login/ui/login_display_host_common.h" +#include "ash/constants/ash_features.h" #include "ash/public/cpp/login_accelerators.h" #include "base/bind.h" #include "base/callback.h" @@ -405,6 +406,11 @@ return true; } + if (kiosk_launch_controller_ && + kiosk_launch_controller_->HandleAccelerator(action)) { + return true; + } + // This path should only handle screen-specific acceletators, so we do not // need to create WebUI here. if (IsWizardControllerCreated() && @@ -452,6 +458,15 @@ StartUserOnboarding(); } +void LoginDisplayHostCommon::ShowNewTermsForFlexUsers() { + // TODO(b/196201668): show EULA screen to users if consolidated consent isn't + // enabled. + DCHECK(features::IsOobeConsolidatedConsentEnabled()); + SetScreenAfterManagedTos(ConsolidatedConsentScreenView::kScreenId); + wizard_context_->is_cloud_ready_update_flow = true; + StartWizard(TermsOfServiceScreenView::kScreenId); +} + void LoginDisplayHostCommon::SetAuthSessionForOnboarding( const UserContext& user_context) { if (PinSetupScreen::ShouldSkipBecauseOfPolicy())
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.h b/chrome/browser/ash/login/ui/login_display_host_common.h index ec369240..de179c9 100644 --- a/chrome/browser/ash/login/ui/login_display_host_common.h +++ b/chrome/browser/ash/login/ui/login_display_host_common.h
@@ -77,6 +77,7 @@ void ResumeUserOnboarding(OobeScreenId screen_id) final; void StartManagementTransition() final; void ShowTosForExistingUser() final; + void ShowNewTermsForFlexUsers() final; void StartEncryptionMigration( const UserContext& user_context, EncryptionMigrationMode migration_mode,
diff --git a/chrome/browser/ash/login/ui/mock_signin_ui.h b/chrome/browser/ash/login/ui/mock_signin_ui.h index a7bb4a5..2b3efee 100644 --- a/chrome/browser/ash/login/ui/mock_signin_ui.h +++ b/chrome/browser/ash/login/ui/mock_signin_ui.h
@@ -24,6 +24,7 @@ MOCK_METHOD(void, ResumeUserOnboarding, (OobeScreenId), (override)); MOCK_METHOD(void, StartManagementTransition, (), (override)); MOCK_METHOD(void, ShowTosForExistingUser, (), (override)); + MOCK_METHOD(void, ShowNewTermsForFlexUsers, (), (override)); MOCK_METHOD(void, StartEncryptionMigration, (const UserContext&,
diff --git a/chrome/browser/ash/login/ui/signin_ui.h b/chrome/browser/ash/login/ui/signin_ui.h index 85bae754..26c8c37 100644 --- a/chrome/browser/ash/login/ui/signin_ui.h +++ b/chrome/browser/ash/login/ui/signin_ui.h
@@ -53,6 +53,9 @@ virtual void StartManagementTransition() = 0; // Show additional terms of service on login. virtual void ShowTosForExistingUser() = 0; + // After users update from CloudReady to a new OS version show them new + // license agreement and data collection consent. + virtual void ShowNewTermsForFlexUsers() = 0; virtual void StartEncryptionMigration( const UserContext& user_context,
diff --git a/chrome/browser/ash/login/users/supervised_user_manager.h b/chrome/browser/ash/login/users/supervised_user_manager.h index 89270ef8..2349483 100644 --- a/chrome/browser/ash/login/users/supervised_user_manager.h +++ b/chrome/browser/ash/login/users/supervised_user_manager.h
@@ -22,10 +22,11 @@ extern const char kRequirePasswordUpdate[]; extern const char kHasIncompleteKey[]; - // Base class for SupervisedUserManagerImpl - provides a mechanism for getting // and setting specific values for supervised users, as well as additional // lookup methods that make sense only for supervised users. +// TODO(b/231321563): Check this entire class is not used anymore for +// deprecated supervised users and remove it with all dependencies. class SupervisedUserManager { public: // Registers user manager preferences.
diff --git a/chrome/browser/ash/login/users/supervised_user_manager_impl.h b/chrome/browser/ash/login/users/supervised_user_manager_impl.h index 82dc10c..41ec5f1 100644 --- a/chrome/browser/ash/login/users/supervised_user_manager_impl.h +++ b/chrome/browser/ash/login/users/supervised_user_manager_impl.h
@@ -13,7 +13,7 @@ class ChromeUserManagerImpl; class CrosSettings; -// TODO(crbug.com/1155729): Check this entire class is not used anymore for +// TODO(b/231321563): Check this entire class is not used anymore for // deprecated supervised users and remove it with all dependencies. // Implementation of the UserManager. class SupervisedUserManagerImpl : public SupervisedUserManager {
diff --git a/chrome/browser/ash/login/wizard_context.h b/chrome/browser/ash/login/wizard_context.h index 2eccb48..dfadd9b 100644 --- a/chrome/browser/ash/login/wizard_context.h +++ b/chrome/browser/ash/login/wizard_context.h
@@ -108,6 +108,16 @@ // TermsOfServiceScreen should be shown on login this will be set to // ash::OOBE_SCREEN_UNKNOWN. OobeScreenId screen_after_managed_tos; + + // If this is a first login after update from CloudReady to a new version. + // During such an update show users license agreement and data collection + // consent. + bool is_cloud_ready_update_flow = false; + + // Determining ownership can take some time. Instead of finding out if the + // current user is an owner of the device we reuse this value. It is set + // during ConsolidatedConsentScreen. + absl::optional<bool> is_owner_flow; }; } // namespace ash
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 1064e9b..75ad139 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -1147,6 +1147,10 @@ ConsolidatedConsentScreen::Result result) { OnScreenExit(ConsolidatedConsentScreenView::kScreenId, ConsolidatedConsentScreen::GetResultString(result)); + if (wizard_context_->is_cloud_ready_update_flow) { + AdvanceToScreen(HWDataCollectionView::kScreenId); + return; + } switch (result) { case ConsolidatedConsentScreen::Result::ACCEPTED: case ConsolidatedConsentScreen::Result::NOT_APPLICABLE: @@ -1222,6 +1226,10 @@ HWDataCollectionScreen::Result result) { OnScreenExit(HWDataCollectionView::kScreenId, HWDataCollectionScreen::GetResultString(result)); + if (wizard_context_->is_cloud_ready_update_flow) { + OnOobeFlowFinished(); + return; + } ShowFingerprintSetupScreen(); } @@ -2002,6 +2010,7 @@ if (is_out_of_box_ && IsResumableOobeScreen(current_screen_->screen_id())) { StartupUtils::SaveOobePendingScreen(current_screen_->screen_id().name); } else if (IsResumablePostLoginScreen(current_screen_->screen_id()) && + !wizard_context_->is_cloud_ready_update_flow && wizard_context_->screen_after_managed_tos != ash::OOBE_SCREEN_UNKNOWN) { // If screen_after_managed_tos == SCREEN_UNKNOWN means that the onboarding
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc b/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc index ee1ea7d3..b441ebd 100644 --- a/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc +++ b/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc
@@ -544,6 +544,10 @@ onc::network_type::kWiFi); EXPECT_EQ(OncWiFiGetSecurity(properties), onc::wifi::kWPA_EAP); EXPECT_EQ(OncGetEapIdentity(properties), OncGetEapIdentity(network)); + EXPECT_EQ(OncGetEapInner(properties), OncGetEapInner(network)); + EXPECT_EQ(OncGetEapOuter(properties), OncGetEapOuter(network)); + EXPECT_EQ(OncGetEapSaveCredentials(properties), + OncGetEapSaveCredentials(network)); EXPECT_TRUE(OncIsEapWithoutClientCertificate(properties)); } @@ -568,6 +572,10 @@ onc::network_type::kWiFi); EXPECT_EQ(OncWiFiGetSecurity(properties), onc::wifi::kWPA_EAP); EXPECT_EQ(OncGetEapIdentity(properties), OncGetEapIdentity(network)); + EXPECT_EQ(OncGetEapInner(properties), OncGetEapInner(network)); + EXPECT_EQ(OncGetEapOuter(properties), OncGetEapOuter(network)); + EXPECT_EQ(OncGetEapSaveCredentials(properties), + OncGetEapSaveCredentials(network)); EXPECT_TRUE(OncIsEapWithoutClientCertificate(properties)); EXPECT_EQ(GetStringValue(properties, onc::network_config::kSource), onc::network_config::kSourceDevicePolicy); @@ -626,6 +634,10 @@ onc::network_type::kEthernet); EXPECT_EQ(OncEthernetGetAuthentication(properties), onc::ethernet::k8021X); EXPECT_EQ(OncGetEapIdentity(properties), OncGetEapIdentity(network)); + EXPECT_EQ(OncGetEapInner(properties), OncGetEapInner(network)); + EXPECT_EQ(OncGetEapOuter(properties), OncGetEapOuter(network)); + EXPECT_EQ(OncGetEapSaveCredentials(properties), + OncGetEapSaveCredentials(network)); EXPECT_TRUE(OncIsEapWithoutClientCertificate(properties)); } @@ -649,6 +661,10 @@ onc::network_type::kEthernet); EXPECT_EQ(OncEthernetGetAuthentication(properties), onc::ethernet::k8021X); EXPECT_EQ(OncGetEapIdentity(properties), OncGetEapIdentity(network)); + EXPECT_EQ(OncGetEapInner(properties), OncGetEapInner(network)); + EXPECT_EQ(OncGetEapOuter(properties), OncGetEapOuter(network)); + EXPECT_EQ(OncGetEapSaveCredentials(properties), + OncGetEapSaveCredentials(network)); EXPECT_TRUE(OncIsEapWithoutClientCertificate(properties)); EXPECT_EQ(GetStringValue(properties, onc::network_config::kSource), onc::network_config::kSourceDevicePolicy);
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_onc_util.cc b/chrome/browser/ash/net/rollback_network_config/rollback_onc_util.cc index b3626cc9..dc0ced6 100644 --- a/chrome/browser/ash/net/rollback_network_config/rollback_onc_util.cc +++ b/chrome/browser/ash/net/rollback_network_config/rollback_onc_util.cc
@@ -83,6 +83,12 @@ return *value; } +bool GetBoolValue(const base::Value& network, const std::string& key) { + absl::optional<bool> value = network.FindBoolKey(key); + DCHECK(value); + return *value; +} + void ManagedOncCollapseToActive(base::Value* network) { DCHECK(network); if (!network->is_dict()) { @@ -228,6 +234,11 @@ return GetStringValue(*eap, onc::eap::kOuter); } +bool OncGetEapSaveCredentials(const base::Value& network) { + const base::Value* eap = OncGetEap(network); + return GetBoolValue(*eap, onc::eap::kSaveCredentials); +} + std::string OncGetEapPassword(const base::Value& network) { const base::Value* eap = OncGetEap(network); return GetStringValue(*eap, onc::eap::kPassword);
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_onc_util.h b/chrome/browser/ash/net/rollback_network_config/rollback_onc_util.h index 2d5cd89..42675d99 100644 --- a/chrome/browser/ash/net/rollback_network_config/rollback_onc_util.h +++ b/chrome/browser/ash/net/rollback_network_config/rollback_onc_util.h
@@ -18,6 +18,10 @@ // be found. std::string GetStringValue(const base::Value& network, const std::string& key); +// Returns the value of the given key. This will crash if bool value can not be +// found. +bool GetBoolValue(const base::Value& network, const std::string& key); + // Managed ONC // Collapses a managed onc dictionary to the values that are marked as active @@ -67,6 +71,7 @@ std::string OncGetEapIdentity(const base::Value& network); std::string OncGetEapInner(const base::Value& network); std::string OncGetEapOuter(const base::Value& network); +bool OncGetEapSaveCredentials(const base::Value& network); std::string OncGetEapPassword(const base::Value& network); std::string OncGetEapClientCertType(const base::Value& network); std::string OncGetEapClientCertPKCS11Id(const base::Value& network);
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc index e785f69..65660b66 100644 --- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc +++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
@@ -18,6 +18,7 @@ #include "base/test/test_future.h" #include "base/threading/sequenced_task_runner_handle.h" #include "chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h" +#include "chrome/browser/chromeos/policy/dlp/dlp_content_restriction_set.h" #include "chrome/browser/chromeos/policy/dlp/dlp_histogram_helper.h" #include "chrome/browser/chromeos/policy/dlp/dlp_policy_event.pb.h" #include "chrome/browser/chromeos/policy/dlp/dlp_reporting_manager.h" @@ -175,60 +176,6 @@ } } - void StartDesktopScreenShare( - content::WebContents* web_contents, - blink::mojom::MediaStreamRequestResult expected_result) { - const GURL origin(kExampleUrl); - const std::string id = - content::DesktopStreamsRegistry::GetInstance()->RegisterStream( - web_contents->GetMainFrame()->GetProcess()->GetID(), - web_contents->GetMainFrame()->GetRoutingID(), - url::Origin::Create(origin), - content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, - content::DesktopMediaID::kFakeId), - /*extension_name=*/"", - content::DesktopStreamRegistryType::kRegistryStreamTypeDesktop); - content::MediaStreamRequest request( - web_contents->GetMainFrame()->GetProcess()->GetID(), - web_contents->GetMainFrame()->GetRoutingID(), /*page_request_id=*/0, - origin, /*user_gesture=*/false, blink::MEDIA_GENERATE_STREAM, - /*requested_audio_device_id=*/std::string(), id, - blink::mojom::MediaStreamType::NO_SERVICE, - blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE, - /*disable_local_echo=*/false, - /*request_pan_tilt_zoom_permission=*/false); - DesktopCaptureAccessHandler access_handler{ - std::make_unique<FakeDesktopMediaPickerFactory>()}; - - base::test::TestFuture< - std::reference_wrapper<const blink::MediaStreamDevices>, - blink::mojom::MediaStreamRequestResult, - std::unique_ptr<content::MediaStreamUI>> - test_future; - - access_handler.HandleRequest( - web_contents, request, - test_future.GetCallback<const blink::MediaStreamDevices&, - blink::mojom::MediaStreamRequestResult, - std::unique_ptr<content::MediaStreamUI>>(), - /*extension=*/nullptr); - - ASSERT_TRUE(test_future.Wait()) << "MediaResponseCallback timed out."; - - EXPECT_EQ(test_future.Get<1>(), expected_result); - } - - void CheckScreenshotRestriction(ScreenshotArea area, bool expected_allowed) { - base::RunLoop run_loop; - static_cast<DlpContentManagerAsh*>(helper_->GetContentManager()) - ->CheckScreenshotRestriction( - area, base::BindLambdaForTesting([&](bool allowed) { - EXPECT_EQ(expected_allowed, allowed); - run_loop.Quit(); - })); - run_loop.Run(); - } - // Checks that there is an expected number of blocked/not blocked and // warned/not warned data points. Number of not blocked and not warned data // points is the difference between |total_count| and |blocked_count| and @@ -259,92 +206,69 @@ std::vector<DlpPolicyEvent> events_; }; -IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest, ScreenshotsRestricted) { - SetupReporting(); - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kExampleUrl))); - content::WebContents* web_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - aura::Window* root_window = - browser()->window()->GetNativeWindow()->GetRootWindow(); - ScreenshotArea fullscreen = ScreenshotArea::CreateForAllRootWindows(); - ScreenshotArea window = - ScreenshotArea::CreateForWindow(web_contents->GetNativeView()); - const gfx::Rect web_contents_rect = web_contents->GetContainerBounds(); - gfx::Rect out_rect(web_contents_rect); - out_rect.Offset(web_contents_rect.width(), web_contents_rect.height()); - gfx::Rect in_rect(web_contents_rect); - in_rect.Offset(web_contents_rect.width() / 2, web_contents_rect.height() / 2); - ScreenshotArea partial_out = - ScreenshotArea::CreateForPartialWindow(root_window, out_rect); - ScreenshotArea partial_in = - ScreenshotArea::CreateForPartialWindow(root_window, in_rect); +struct TestParams { + TestParams(std::string test_name, + DlpRulesManager::Level level, + std::vector<int> blocked_counts, + std::vector<int> warned_counts, + std::vector<int> total_counts, + std::vector<size_t> report_event_counts, + bool expect_allowed, + int warning_dialog_count = 0) + : test_name(std::move(test_name)), + level(level), + restriction_set(DlpContentRestriction::kScreenshot, level), + warning_dialog_count(warning_dialog_count), + blocked_counts(std::move(blocked_counts)), + warned_counts(std::move(warned_counts)), + total_counts(std::move(total_counts)), + report_event_counts(std::move(report_event_counts)), + expect_allowed(expect_allowed) {} - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(window, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/0, /*warned_count=*/0, - /*total_count=*/4, - /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, - /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kBlock, 0u); + ~TestParams() = default; - helper_->ChangeConfidentiality(web_contents, kScreenshotRestricted); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/false); - CheckScreenshotRestriction(window, /*expected_allowed=*/false); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/false); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/3, /*warned_count=*/0, - /*total_count=*/8, - /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, - /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kBlock, 3u); + std::string test_name; + DlpRulesManager::Level level; + DlpContentRestrictionSet restriction_set; + // Total number of expected warning dialogs. Once bypassed, warning is not + // shown for the same content. + int warning_dialog_count; + // Numbers of expected block, warn, and total UMA histogram points. + std::vector<int> blocked_counts; + std::vector<int> warned_counts; + std::vector<int> total_counts; + // Number of expected report events. Note that this can differ from + // total_counts (UMA) as report events are deduplicated. + std::vector<size_t> report_event_counts; + bool expect_allowed; +}; - web_contents->WasHidden(); - helper_->ChangeVisibility(web_contents); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(window, /*expected_allowed=*/false); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/4, /*warned_count=*/0, - /*total_count=*/12, - /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, - /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kBlock, 4u); +class ScreenshotTest : public DlpContentManagerAshBrowserTest, + public testing::WithParamInterface<TestParams> { + public: + ScreenshotTest() = default; + ~ScreenshotTest() override = default; - web_contents->WasShown(); - helper_->ChangeVisibility(web_contents); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/false); - CheckScreenshotRestriction(window, /*expected_allowed=*/false); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/false); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/7, /*warned_count=*/0, - /*total_count=*/16, - /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, - /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kBlock, 7u); + protected: + void CheckScreenshotRestriction(ScreenshotArea area, bool expected_allowed) { + base::RunLoop run_loop; + static_cast<DlpContentManagerAsh*>(helper_->GetContentManager()) + ->CheckScreenshotRestriction( + area, base::BindLambdaForTesting([&](bool allowed) { + EXPECT_EQ(expected_allowed, allowed); + run_loop.Quit(); + })); + run_loop.Run(); + } +}; - helper_->DestroyWebContents(web_contents); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/7, /*warned_count=*/0, - /*total_count=*/19, - /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, - /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kBlock, 7u); -} - -IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest, ScreenshotsWarned) { +IN_PROC_BROWSER_TEST_P(ScreenshotTest, CheckRestriction) { + const TestParams& param = GetParam(); SetupReporting(); auto* mock_dlp_warn_notifier = - CreateAndSetMockDlpWarnNotifier(/*should_proceed=*/false); - EXPECT_CALL(*mock_dlp_warn_notifier, ShowDlpWarningDialog(_, _)).Times(7); + CreateAndSetMockDlpWarnNotifier(/*should_proceed=*/param.expect_allowed); + EXPECT_CALL(*mock_dlp_warn_notifier, ShowDlpWarningDialog) + .Times(param.warning_dialog_count); ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kExampleUrl))); content::WebContents* web_contents = @@ -368,127 +292,91 @@ CheckScreenshotRestriction(window, /*expected_allowed=*/true); CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/0, /*warned_count=*/0, + VerifyHistogramCounts(param.blocked_counts[0], param.warned_counts[0], /*total_count=*/4, /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kWarn, 0u); + CheckEvents(DlpRulesManager::Restriction::kScreenshot, param.level, + param.report_event_counts[0]); - helper_->ChangeConfidentiality(web_contents, kScreenshotWarned); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/false); - CheckScreenshotRestriction(window, /*expected_allowed=*/false); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/false); + helper_->ChangeConfidentiality(web_contents, param.restriction_set); + CheckScreenshotRestriction(fullscreen, + /*expected_allowed=*/param.expect_allowed); + CheckScreenshotRestriction(window, /*expected_allowed=*/param.expect_allowed); + CheckScreenshotRestriction(partial_in, + /*expected_allowed=*/param.expect_allowed); CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/0, /*warned_count=*/3, + VerifyHistogramCounts(param.blocked_counts[1], param.warned_counts[1], /*total_count=*/8, /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kWarn, 3u); + CheckEvents(DlpRulesManager::Restriction::kScreenshot, param.level, + param.report_event_counts[1]); web_contents->WasHidden(); helper_->ChangeVisibility(web_contents); CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(window, /*expected_allowed=*/false); + CheckScreenshotRestriction(window, /*expected_allowed=*/param.expect_allowed); CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/0, /*warned_count=*/4, + VerifyHistogramCounts(param.blocked_counts[2], param.warned_counts[2], /*total_count=*/12, /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kWarn, 4u); + CheckEvents(DlpRulesManager::Restriction::kScreenshot, param.level, + param.report_event_counts[2]); web_contents->WasShown(); helper_->ChangeVisibility(web_contents); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/false); - CheckScreenshotRestriction(window, /*expected_allowed=*/false); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/false); + CheckScreenshotRestriction(fullscreen, + /*expected_allowed=*/param.expect_allowed); + CheckScreenshotRestriction(window, /*expected_allowed=*/param.expect_allowed); + CheckScreenshotRestriction(partial_in, + /*expected_allowed=*/param.expect_allowed); CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/0, /*warned_count=*/7, + VerifyHistogramCounts(param.blocked_counts[3], param.warned_counts[3], /*total_count=*/16, /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kWarn, 7u); + CheckEvents(DlpRulesManager::Restriction::kScreenshot, param.level, + param.report_event_counts[3]); helper_->DestroyWebContents(web_contents); CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/0, /*warned_count=*/7, + VerifyHistogramCounts(param.blocked_counts[3], param.warned_counts[3], /*total_count=*/19, /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kWarn, 7u); + CheckEvents(DlpRulesManager::Restriction::kScreenshot, param.level, + param.report_event_counts[3]); } -// Calls to CheckScreenshotRestriction() should not be reported if allowed. -IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest, ScreenshotsReported) { +IN_PROC_BROWSER_TEST_F(ScreenshotTest, WarningProceededReportedAfterCapture) { SetupReporting(); + auto* mock_dlp_warn_notifier = + CreateAndSetMockDlpWarnNotifier(/*should_proceed=*/true); + EXPECT_CALL(*mock_dlp_warn_notifier, ShowDlpWarningDialog).Times(1); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kExampleUrl))); content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - aura::Window* root_window = - browser()->window()->GetNativeWindow()->GetRootWindow(); + helper_->ChangeConfidentiality(web_contents, kScreenshotWarned); ScreenshotArea fullscreen = ScreenshotArea::CreateForAllRootWindows(); - ScreenshotArea window = - ScreenshotArea::CreateForWindow(web_contents->GetNativeView()); - const gfx::Rect web_contents_rect = web_contents->GetContainerBounds(); - gfx::Rect out_rect(web_contents_rect); - out_rect.Offset(web_contents_rect.width(), web_contents_rect.height()); - gfx::Rect in_rect(web_contents_rect); - in_rect.Offset(web_contents_rect.width() / 2, web_contents_rect.height() / 2); - ScreenshotArea partial_out = - ScreenshotArea::CreateForPartialWindow(root_window, out_rect); - ScreenshotArea partial_in = - ScreenshotArea::CreateForPartialWindow(root_window, in_rect); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(window, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kReport, 0u); - - helper_->ChangeConfidentiality(web_contents, kScreenshotReported); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(window, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kReport, 0u); - - web_contents->WasHidden(); - helper_->ChangeVisibility(web_contents); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(window, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kReport, 0u); - - web_contents->WasShown(); - helper_->ChangeVisibility(web_contents); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(window, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kReport, 0u); - - helper_->DestroyWebContents(web_contents); - CheckScreenshotRestriction(fullscreen, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_in, /*expected_allowed=*/true); - CheckScreenshotRestriction(partial_out, /*expected_allowed=*/true); - VerifyHistogramCounts(/*blocked_count=*/0, /*warned_count=*/0, - /*total_count=*/19, - /*blocked_suffix=*/dlp::kScreenshotBlockedUMA, - /*warned_suffix=*/dlp::kScreenshotWarnedUMA); - CheckEvents(DlpRulesManager::Restriction::kScreenshot, - DlpRulesManager::Level::kReport, 0u); + DlpRulesManager::Level::kWarn, 1); + histogram_tester_.ExpectBucketCount( + GetDlpHistogramPrefix() + dlp::kScreenshotWarnProceededUMA, true, 1); + histogram_tester_.ExpectBucketCount( + GetDlpHistogramPrefix() + dlp::kScreenshotWarnProceededUMA, false, 0); + static_cast<DlpContentManagerAsh*>(helper_->GetContentManager()) + ->OnImageCapture(fullscreen); + ASSERT_EQ(events_.size(), 2u); + EXPECT_THAT(events_[1], + IsDlpPolicyEvent(CreateDlpPolicyWarningProceededEvent( + kSrcPattern, DlpRulesManager::Restriction::kScreenshot))); } IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest, @@ -1692,4 +1580,46 @@ GetDlpHistogramPrefix() + dlp::kScreenShareBlockedUMA, true, 1); } +INSTANTIATE_TEST_SUITE_P( + DlpContentManagerAsh, + ScreenshotTest, + testing::ValuesIn<TestParams>({ + TestParams(/*test_name=*/"Restricted", + /*level=*/DlpRulesManager::Level::kBlock, + /*blocked_counts=*/{0, 3, 4, 7}, + /*warned_counts=*/{0, 0, 0, 0}, + /*total_counts=*/{0, 3, 4, 7}, + /*report_event_counts=*/{0u, 3u, 4u, 7u}, + /*expect_allowed=*/false), + TestParams(/*test_name=*/"WarnedAllowed", + /*level=*/DlpRulesManager::Level::kWarn, + /*blocked_counts=*/{0, 0, 0, 0}, + /*warned_counts=*/{0, 3, 4, 7}, + /*total_counts=*/{0, 3, 4, 7}, + /*report_event_counts=*/{0u, 1u, 1u, 1u}, + /*expect_allowed=*/true, + /*warning_dialog_count=*/1), + TestParams(/*test_name=*/"WarnedCanceled", + /*level=*/DlpRulesManager::Level::kWarn, + /*blocked_counts=*/{0, 0, 0, 0}, + /*warned_counts=*/{0, 3, 4, 7}, + /*total_counts=*/{0, 3, 4, 7}, + /*report_event_counts=*/{0u, 3u, 4u, 7u}, + /*expect_allowed=*/false, + /*warning_dialog_count=*/7), + TestParams( + /*test_name=*/"Reported", + /*level=*/DlpRulesManager::Level::kReport, + /*blocked_counts=*/{0, 0, 0, 0}, + /*warned_counts=*/{0, 0, 0, 0}, + /*total_counts=*/{0, 0, 0, 0}, + // Calls toCheckScreenshotRestriction() should not be reported if + // allowed: + /*report_event_counts=*/{0u, 0u, 0u, 0u}, + /*expect_allowed=*/true), + }), + [](const testing::TestParamInfo<TestParams>& info) { + return info.param.test_name; + }); + } // namespace policy
diff --git a/chrome/browser/ash/settings/owner_pending_setting_controller.h b/chrome/browser/ash/settings/owner_pending_setting_controller.h index f6cf604..13b12a19 100644 --- a/chrome/browser/ash/settings/owner_pending_setting_controller.h +++ b/chrome/browser/ash/settings/owner_pending_setting_controller.h
@@ -36,7 +36,7 @@ // a pending write is queued that is completed as soon as the OSS is ready. // This write will complete even if Chrome is restarted in the meantime. // The caller need not care whether the write was immediate or pending, as long -// as they also use this class to read the value of kStatsReportingPref. +// as they also use this class to read the value of the device pref. // IsEnabled will return the pending value until ownership is taken and the // pending value is written - from then on it will return the signed, stored // value from CrosSettings.
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc index 378e6ecb..760b0675 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -1349,4 +1349,20 @@ return RespondNow(OneArgument(base::Value(true))); } +ExtensionFunction::ResponseAction +FileManagerPrivateSendFeedbackFunction::Run() { + GURL url; + if (GetSenderWebContents()) { + url = GetSenderWebContents()->GetVisibleURL(); + } + + Profile* profile = Profile::FromBrowserContext(browser_context()); + chrome::ShowFeedbackPage(url, profile, chrome::kFeedbackSourceFilesApp, + /*description_template=*/std::string(), + /*description_placeholder_text=*/std::string(), + /*category_tag=*/"chromeos-files-app", + /*extra_diagnostics=*/std::string()); + return RespondNow(NoArguments()); +} + } // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h index d0d9f0f6..9c420515 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
@@ -606,6 +606,19 @@ ResponseAction Run() override; }; +// Implements the chrome.fileManagerPrivate.sendFeedback method. +class FileManagerPrivateSendFeedbackFunction : public ExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.sendFeedback", + FILEMANAGERPRIVATE_SENDFEEDBACK) + + protected: + ~FileManagerPrivateSendFeedbackFunction() override = default; + + private: + ResponseAction Run() override; +}; + } // namespace extensions #endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_PRIVATE_API_MISC_H_
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java index 86b9f784..4204ae9 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java
@@ -6,6 +6,7 @@ import android.content.Context; +import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManagerProvider; import org.chromium.ui.base.WindowAndroid; @@ -13,14 +14,14 @@ /** Factory class to build a {@link DownloadInterstitialCoordinator} instance. */ public class DownloadInterstitialCoordinatorFactory { /** - * @param context The activity context. + * @param contextSupplier Supplier which provides the context of the parent tab. * @param downloadUrl Url spec used for matching and binding the correct offline item. * @param windowAndroid The {@link WindowAndroid} associated with the activity. * @return A new {@link DownloadInterstitialCoordinatorImpl} instance. */ public static DownloadInterstitialCoordinator create( - Context context, String downloadUrl, WindowAndroid windowAndroid) { - return new DownloadInterstitialCoordinatorImpl(context, downloadUrl, + Supplier<Context> contextSupplier, String downloadUrl, WindowAndroid windowAndroid) { + return new DownloadInterstitialCoordinatorImpl(contextSupplier, downloadUrl, OfflineContentAggregatorFactory.get(), SnackbarManagerProvider.from(windowAndroid)); }
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorImpl.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorImpl.java index 6bd5fae..a848830 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorImpl.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorImpl.java
@@ -7,6 +7,7 @@ import android.content.Context; import android.view.View; +import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.components.offline_items_collection.OfflineContentProvider; @@ -25,17 +26,17 @@ /** * Creates a new instance of the {@link DownloadInterstitialCoordinator} implementation. - * @param context The activity context. + * @param contextSupplier Supplier which provides the context of the parent tab. * @param downloadUrl Url spec used for matching and binding the correct offline item. * @param provider An {@link OfflineContentProvider} to observe changes to downloads. * @param snackbarManager Snackbar manager for the current activity. */ - public DownloadInterstitialCoordinatorImpl(Context context, String downloadUrl, - OfflineContentProvider provider, SnackbarManager snackbarManager) { - mView = DownloadInterstitialView.create(context); + public DownloadInterstitialCoordinatorImpl(Supplier<Context> contextSupplier, + String downloadUrl, OfflineContentProvider provider, SnackbarManager snackbarManager) { + mView = DownloadInterstitialView.create(contextSupplier.get()); PropertyModel model = new PropertyModel.Builder(DownloadInterstitialProperties.ALL_KEYS).build(); - mMediator = new DownloadInterstitialMediator(context, model, downloadUrl, provider, + mMediator = new DownloadInterstitialMediator(contextSupplier, model, downloadUrl, provider, snackbarManager, SharedPreferencesManager.getInstance()); mModelChangeProcessor = PropertyModelChangeProcessor.create( model, mView, DownloadInterstitialViewBinder::bind);
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediator.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediator.java index 417c1f7..7745981 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediator.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediator.java
@@ -22,6 +22,7 @@ import org.chromium.base.CollectionUtil; import org.chromium.base.Log; +import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.download.home.list.ListProperties; import org.chromium.chrome.browser.download.home.list.ShareUtils; import org.chromium.chrome.browser.download.home.rename.RenameDialogManager; @@ -54,7 +55,7 @@ class DownloadInterstitialMediator { private static final String TAG = "DownloadInterstitial"; - private final Context mContext; + private final Supplier<Context> mContextSupplier; private final PropertyModel mModel; private final String mDownloadUrl; private final OfflineContentProvider mProvider; @@ -66,7 +67,7 @@ /** * Creates a new DownloadInterstitialMediator instance. - * @param context The activity context. + * @param contextSupplier Supplier which provides the context of the parent tab. * @param model A {@link PropertyModel} containing the properties defined in {@link * DownloadInterstitialProperties}. * @param provider An {@link OfflineContentProvider} used for observing updates about the @@ -74,10 +75,10 @@ * @param snackbarManager A {@link SnackbarManager} used to display snackbars within the * download interstitial view. */ - DownloadInterstitialMediator(Context context, PropertyModel model, String downloadUrl, - OfflineContentProvider provider, SnackbarManager snackbarManager, + DownloadInterstitialMediator(Supplier<Context> contextSupplier, PropertyModel model, + String downloadUrl, OfflineContentProvider provider, SnackbarManager snackbarManager, SharedPreferencesManager sharedPrefs) { - mContext = context; + mContextSupplier = contextSupplier; mModel = model; mDownloadUrl = downloadUrl; mProvider = provider; @@ -114,36 +115,41 @@ mModel.set(STATE, state); switch (state) { case State.IN_PROGRESS: - mModel.set(TITLE_TEXT, mContext.getString(R.string.download_started)); + mModel.set(TITLE_TEXT, mContextSupplier.get().getString(R.string.download_started)); mModel.set(PRIMARY_BUTTON_IS_VISIBLE, false); mModel.set(SECONDARY_BUTTON_TEXT, - mContext.getString(R.string.download_notification_cancel_button)); + mContextSupplier.get().getString( + R.string.download_notification_cancel_button)); mModel.set(SECONDARY_BUTTON_CALLBACK, mModel.get(ListProperties.CALLBACK_CANCEL)); mModel.set(SECONDARY_BUTTON_IS_VISIBLE, true); break; case State.SUCCESSFUL: mModel.set(TITLE_TEXT, - mContext.getResources().getQuantityString( + mContextSupplier.get().getResources().getQuantityString( R.plurals.download_message_multiple_download_complete, 1)); - mModel.set(PRIMARY_BUTTON_TEXT, mContext.getString(R.string.open_downloaded_label)); + mModel.set(PRIMARY_BUTTON_TEXT, + mContextSupplier.get().getString(R.string.open_downloaded_label)); mModel.set(PRIMARY_BUTTON_CALLBACK, mModel.get(ListProperties.CALLBACK_OPEN)); mModel.set(PRIMARY_BUTTON_IS_VISIBLE, true); - mModel.set(SECONDARY_BUTTON_TEXT, mContext.getString(R.string.delete)); + mModel.set( + SECONDARY_BUTTON_TEXT, mContextSupplier.get().getString(R.string.delete)); mModel.set(SECONDARY_BUTTON_CALLBACK, mModel.get(ListProperties.CALLBACK_REMOVE)); mModel.set(SECONDARY_BUTTON_IS_VISIBLE, true); mDownloadIsComplete = true; break; case State.CANCELLED: - mModel.set(TITLE_TEXT, mContext.getString(R.string.menu_download)); - mModel.set(PRIMARY_BUTTON_TEXT, mContext.getString(R.string.menu_download)); + mModel.set(TITLE_TEXT, mContextSupplier.get().getString(R.string.menu_download)); + mModel.set(PRIMARY_BUTTON_TEXT, + mContextSupplier.get().getString(R.string.menu_download)); mModel.set(PRIMARY_BUTTON_CALLBACK, mModel.get(ListProperties.CALLBACK_RESUME)); mModel.set(PRIMARY_BUTTON_IS_VISIBLE, true); mModel.set(SECONDARY_BUTTON_IS_VISIBLE, false); break; case State.PAUSED: - mModel.set(TITLE_TEXT, mContext.getString(R.string.menu_download)); + mModel.set(TITLE_TEXT, mContextSupplier.get().getString(R.string.menu_download)); mModel.set(PRIMARY_BUTTON_TEXT, - mContext.getString(R.string.download_notification_resume_button)); + mContextSupplier.get().getString( + R.string.download_notification_resume_button)); mModel.set(PRIMARY_BUTTON_CALLBACK, mModel.get(ListProperties.CALLBACK_RESUME)); mModel.set(PRIMARY_BUTTON_IS_VISIBLE, true); mModel.set(SECONDARY_BUTTON_IS_VISIBLE, false); @@ -191,9 +197,9 @@ } private void showDeletedSnackbar() { - Snackbar snackbar = Snackbar.make( - mContext.getString(R.string.delete_message, mModel.get(DOWNLOAD_ITEM).title), null, - Snackbar.TYPE_ACTION, Snackbar.UMA_DOWNLOAD_INTERSTITIAL_DOWNLOAD_DELETED); + Snackbar snackbar = Snackbar.make(mContextSupplier.get().getString(R.string.delete_message, + mModel.get(DOWNLOAD_ITEM).title), + null, Snackbar.TYPE_ACTION, Snackbar.UMA_DOWNLOAD_INTERSTITIAL_DOWNLOAD_DELETED); mSnackbarManager.showSnackbar(snackbar); } @@ -214,8 +220,8 @@ private void startShareIntent(Intent intent) { try { - mContext.startActivity(Intent.createChooser( - intent, mContext.getString(R.string.share_link_chooser_title))); + mContextSupplier.get().startActivity(Intent.createChooser( + intent, mContextSupplier.get().getString(R.string.share_link_chooser_title))); } catch (ActivityNotFoundException e) { Log.e(TAG, "Cannot find activity for sharing"); } catch (Exception e) { @@ -224,10 +230,11 @@ } private void startRename(String name, RenameDialogManager.RenameCallback callback) { - ModalDialogManager modalDialogManager = new ModalDialogManager( - new AppModalPresenter(mContext), ModalDialogManager.ModalDialogType.APP); + ModalDialogManager modalDialogManager = + new ModalDialogManager(new AppModalPresenter(mContextSupplier.get()), + ModalDialogManager.ModalDialogType.APP); RenameDialogManager mRenameDialogManager = - new RenameDialogManager(mContext, modalDialogManager); + new RenameDialogManager(mContextSupplier.get(), modalDialogManager); mRenameDialogManager.startRename(name, callback); }
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java index b812fe5..37b9993 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java
@@ -75,8 +75,8 @@ mModel.set(DownloadInterstitialProperties.PRIMARY_BUTTON_TEXT, ""); mModel.set(DownloadInterstitialProperties.SECONDARY_BUTTON_TEXT, CANCEL_BUTTON_TEXT); mProvider.addItem(mItem0); - mMediator = new DownloadInterstitialMediator(InstrumentationRegistry.getTargetContext(), - mModel, mItem0.originalUrl, mProvider, mSnackbarManager, sharedPrefsManager); + mMediator = new DownloadInterstitialMediator(InstrumentationRegistry::getContext, mModel, + mItem0.originalUrl, mProvider, mSnackbarManager, sharedPrefsManager); // Increment progress to trigger onItemUpdated method for OfflineContentProvider observers. // This attaches the OfflineItem to the mediator. mProvider.incrementProgress(mItem0.id); @@ -109,8 +109,8 @@ // Remove observer so that the mediator can attach its own observer. mProvider.setObserver(null); mModel.set(DOWNLOAD_ITEM, null); - mMediator = new DownloadInterstitialMediator(InstrumentationRegistry.getTargetContext(), - mModel, item1.originalUrl, mProvider, mSnackbarManager, + mMediator = new DownloadInterstitialMediator(InstrumentationRegistry::getContext, mModel, + item1.originalUrl, mProvider, mSnackbarManager, SharedPreferencesManager.getInstance()); mProvider.incrementProgress(mItem0.id); mProvider.addItem(item1);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 91f0a2f..3d576e5 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -5840,7 +5840,7 @@ { "name": "update-history-entry-points-in-incognito", "owners": [ "sideyilmaz", "chrome-incognito@google.com" ], - "expiry_milestone": 99 + "expiry_milestone": 105 }, { "name": "update-menu-item-custom-summary",
diff --git a/chrome/browser/lacros/browser_service_lacros.cc b/chrome/browser/lacros/browser_service_lacros.cc index bafdd21..151738c 100644 --- a/chrome/browser/lacros/browser_service_lacros.cc +++ b/chrome/browser/lacros/browser_service_lacros.cc
@@ -185,6 +185,11 @@ NOTIMPLEMENTED(); } +void BrowserServiceLacros::REMOVED_16( + base::flat_map<policy::PolicyNamespace, std::vector<uint8_t>> policy) { + NOTIMPLEMENTED(); +} + void BrowserServiceLacros::NewWindow(bool incognito, bool should_trigger_session_restore, NewWindowCallback callback) { @@ -675,7 +680,7 @@ } void BrowserServiceLacros::UpdateComponentPolicy( - base::flat_map<policy::PolicyNamespace, std::vector<uint8_t>> policy) { + policy::ComponentPolicyMap policy) { // TODO(crbug.com/1284279): Process received data in Lacros. }
diff --git a/chrome/browser/lacros/browser_service_lacros.h b/chrome/browser/lacros/browser_service_lacros.h index 188a647d..dda9bec 100644 --- a/chrome/browser/lacros/browser_service_lacros.h +++ b/chrome/browser/lacros/browser_service_lacros.h
@@ -13,6 +13,7 @@ #include "chrome/browser/ui/browser_list_observer.h" #include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "components/feedback/system_logs/system_logs_source.h" +#include "components/policy/core/common/values_util.h" #include "mojo/public/cpp/bindings/receiver.h" class GURL; @@ -32,6 +33,8 @@ // crosapi::mojom::BrowserService: void REMOVED_0(REMOVED_0Callback callback) override; void REMOVED_2(crosapi::mojom::BrowserInitParamsPtr) override; + void REMOVED_16(base::flat_map<policy::PolicyNamespace, std::vector<uint8_t>> + policy) override; void NewWindow(bool incognito, bool should_trigger_session_restore, NewWindowCallback callback) override; @@ -92,9 +95,7 @@ Profile* profile); void RestoreTabWithProfile(RestoreTabCallback callback, Profile* profile); void OpenForFullRestoreWithProfile(Profile* profile); - void UpdateComponentPolicy( - base::flat_map<policy::PolicyNamespace, std::vector<uint8_t>> policy) - override; + void UpdateComponentPolicy(policy::ComponentPolicyMap policy) override; // Called when a session is restored. void OnSessionRestored(Profile* profile, int num_tabs_restored);
diff --git a/chrome/browser/profiles/profile_attributes_storage.cc b/chrome/browser/profiles/profile_attributes_storage.cc index 969451e..a3cb7574 100644 --- a/chrome/browser/profiles/profile_attributes_storage.cc +++ b/chrome/browser/profiles/profile_attributes_storage.cc
@@ -481,7 +481,7 @@ } std::vector<ProfileAttributesEntry*> -ProfileAttributesStorage::GetAllProfilesAttributesSortedByLocalProfilName() +ProfileAttributesStorage::GetAllProfilesAttributesSortedByLocalProfileName() const { return GetAllProfilesAttributesSorted(true); }
diff --git a/chrome/browser/profiles/profile_attributes_storage.h b/chrome/browser/profiles/profile_attributes_storage.h index 0c1cc69..d98579b9 100644 --- a/chrome/browser/profiles/profile_attributes_storage.h +++ b/chrome/browser/profiles/profile_attributes_storage.h
@@ -79,7 +79,7 @@ // Returns all non-Guest profile attributes sorted by local profile name. std::vector<ProfileAttributesEntry*> - GetAllProfilesAttributesSortedByLocalProfilName() const; + GetAllProfilesAttributesSortedByLocalProfileName() const; // Returns a ProfileAttributesEntry with the data for the profile at |path| // if the operation is successful. Returns |nullptr| otherwise.
diff --git a/chrome/browser/resources/chromeos/login/components/display_manager_types.js b/chrome/browser/resources/chromeos/login/components/display_manager_types.js index 0f24b47..a00116e 100644 --- a/chrome/browser/resources/chromeos/login/components/display_manager_types.js +++ b/chrome/browser/resources/chromeos/login/components/display_manager_types.js
@@ -99,9 +99,6 @@ /* #export */ const ACCELERATOR_CANCEL = 'cancel'; /* #export */ const ACCELERATOR_VERSION = 'version'; /* #export */ const ACCELERATOR_RESET = 'reset'; -/* #export */ const ACCELERATOR_APP_LAUNCH_BAILOUT = 'app_launch_bailout'; -/* #export */ const ACCELERATOR_APP_LAUNCH_NETWORK_CONFIG = - 'app_launch_network_config'; /* #export */ const USER_ACTION_ROLLBACK_TOGGLED = 'rollback-toggled';
diff --git a/chrome/browser/resources/chromeos/login/display_manager.js b/chrome/browser/resources/chromeos/login/display_manager.js index e1cf0b1..662b093f 100644 --- a/chrome/browser/resources/chromeos/login/display_manager.js +++ b/chrome/browser/resources/chromeos/login/display_manager.js
@@ -12,7 +12,7 @@ // #import {OobeTypes} from './components/oobe_types.m.js'; -// #import {RESET_AVAILABLE_SCREEN_GROUP, SCREEN_APP_LAUNCH_SPLASH, SCREEN_GAIA_SIGNIN, DISPLAY_TYPE, ACCELERATOR_CANCEL, ACCELERATOR_VERSION, ACCELERATOR_RESET, ACCELERATOR_APP_LAUNCH_BAILOUT, SCREEN_OOBE_RESET, SCREEN_DEVICE_DISABLED, USER_ACTION_ROLLBACK_TOGGLED, ACCELERATOR_APP_LAUNCH_NETWORK_CONFIG, OOBE_UI_STATE, SCREEN_WELCOME } from './components/display_manager_types.m.js'; +// #import {RESET_AVAILABLE_SCREEN_GROUP, SCREEN_APP_LAUNCH_SPLASH, SCREEN_GAIA_SIGNIN, DISPLAY_TYPE, ACCELERATOR_CANCEL, ACCELERATOR_VERSION, ACCELERATOR_RESET, SCREEN_OOBE_RESET, SCREEN_DEVICE_DISABLED, USER_ACTION_ROLLBACK_TOGGLED, OOBE_UI_STATE, SCREEN_WELCOME } from './components/display_manager_types.m.js'; // #import {MultiTapDetector} from './multi_tap_detector.m.js'; // #import {keyboard} from './keyboard_utils.m.js' // #import {DisplayManagerScreenAttributes} from './components/display_manager_types.m.js' @@ -279,14 +279,6 @@ RESET_AVAILABLE_SCREEN_GROUP.indexOf(currentStepId) != -1) { chrome.send('toggleResetScreen'); } - } else if (name == ACCELERATOR_APP_LAUNCH_BAILOUT) { - if (currentStepId == SCREEN_APP_LAUNCH_SPLASH) { - chrome.send('cancelAppLaunch'); - } - } else if (name == ACCELERATOR_APP_LAUNCH_NETWORK_CONFIG) { - if (currentStepId == SCREEN_APP_LAUNCH_SPLASH) { - chrome.send('networkConfigRequest'); - } } }
diff --git a/chrome/browser/resources/chromeos/login/test_api/test_api.js b/chrome/browser/resources/chromeos/login/test_api/test_api.js index 9d7946e..cfce043 100644 --- a/chrome/browser/resources/chromeos/login/test_api/test_api.js +++ b/chrome/browser/resources/chromeos/login/test_api/test_api.js
@@ -460,6 +460,67 @@ } } +class OfflineLoginScreenTester extends ScreenElementApi { + constructor() { + super('offline-login'); + this.nextButton = new PolymerElementApi(this, '#nextButton'); + } + + /** + * Returns if the Offline Login Screen is ready for test interaction. + * @return {boolean} + */ + isReadyForTesting() { + return this.isVisible() && this.nextButton.isVisible(); + } + + /** + * Returns the email field name on the Offline Login Screen. + * @return {string} + */ + getEmailFieldName() { + return loadTimeData.getString('offlineLoginEmail'); + } + + /** + * Returns the password field name on the Offline Login Screen. + * @return {string} + */ + getPasswordFieldName() { + return loadTimeData.getString('offlineLoginPassword'); + } + + /** + * Returns the next button name on the Offline Login Screen. + * @return {string} + */ + getNextButtonName() { + return loadTimeData.getString('offlineLoginNextBtn'); + } +} + +class ErrorScreenTester extends ScreenElementApi { + constructor() { + super('error-message'); + this.offlineLink = new PolymerElementApi(this, '#error-offline-login-link'); + } + + /** + * Returns if the Error Screen is ready for test interaction. + * @return {boolean} + */ + isReadyForTesting() { + return this.isVisible() && this.offlineLink.isVisible(); + } + + /** + * Click the sign in as an existing user Link. + */ + clickSignInAsExistingUserLink() { + return this.offlineLink.click(); + } +} + class OobeApiProvider { constructor() { this.screens = { @@ -479,6 +540,8 @@ PinSetupScreen: new PinSetupScreenTester(), EnterpriseEnrollmentScreen: new EnterpriseEnrollmentScreenTester(), GuestTosScreen: new GuestTosScreenTester(), + ErrorScreen: new ErrorScreenTester(), + OfflineLoginScreen: new OfflineLoginScreenTester(), }; this.loginWithPin = function(username, pin) {
diff --git a/chrome/browser/resources/settings/chromeos/device_page/device_page.js b/chrome/browser/resources/settings/chromeos/device_page/device_page.js index 370cb16..77ed27e3 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/device_page.js +++ b/chrome/browser/resources/settings/chromeos/device_page/device_page.js
@@ -19,152 +19,128 @@ import '../../settings_page/settings_subpage.js'; import '../../settings_shared_css.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js'; +import {I18nBehavior} from '//resources/js/i18n_behavior.m.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from '//resources/js/web_ui_listener_behavior.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {WebUIListenerBehavior} from '//resources/js/web_ui_listener_behavior.m.js'; +import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {Router} from '../../router.js'; +import {Route, Router} from '../../router.js'; import {routes} from '../os_route.js'; -import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js'; +import {RouteObserverBehavior} from '../route_observer_behavior.js'; -import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl} from './device_page_browser_proxy.js'; +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, getDisplayApi, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, StorageSpaceState} from './device_page_browser_proxy.js'; -/** - * @constructor - * @extends {PolymerElement} - * @implements {I18nBehaviorInterface} - * @implements {WebUIListenerBehaviorInterface} - * @implements {RouteObserverBehaviorInterface} - */ -const SettingsDevicePageElementBase = mixinBehaviors( - [I18nBehavior, WebUIListenerBehavior, RouteObserverBehavior], - PolymerElement); +Polymer({ + _template: html`{__html_template__}`, + is: 'settings-device-page', -/** @polymer */ -class SettingsDevicePageElement extends SettingsDevicePageElementBase { - static get is() { - return 'settings-device-page'; - } + behaviors: [ + I18nBehavior, + WebUIListenerBehavior, + RouteObserverBehavior, + ], - static get template() { - return html`{__html_template__}`; - } + properties: { + prefs: { + type: Object, + notify: true, + }, - static get properties() { - return { - prefs: { - type: Object, - notify: true, + showCrostini: Boolean, + + /** + * |hasMouse_|, |hasPointingStick_|, and |hasTouchpad_| start undefined so + * observers don't trigger until they have been populated. + * @private + */ + hasMouse_: Boolean, + + /** + * Whether a pointing stick (such as a TrackPoint) is connected. + * @private + */ + hasPointingStick_: Boolean, + + /** @private */ + hasTouchpad_: Boolean, + + /** + * Whether the device has a haptic touchpad. If this is true, |hasTouchpad_| + * will also be true. + * @private + */ + hasHapticTouchpad_: Boolean, + + /** + * |hasStylus_| is initialized to false so that dom-if behaves correctly. + * @private + */ + hasStylus_: { + type: Boolean, + value: false, + }, + + /** + * Whether storage management info should be hidden. + * @private + */ + hideStorageInfo_: { + type: Boolean, + value() { + // TODO(crbug.com/868747): Show an explanatory message instead. + return loadTimeData.valueExists('isDemoSession') && + loadTimeData.getBoolean('isDemoSession'); }, + readOnly: true, + }, - showCrostini: Boolean, - - /** - * |hasMouse_|, |hasPointingStick_|, and |hasTouchpad_| start undefined so - * observers don't trigger until they have been populated. - * @private - */ - hasMouse_: Boolean, - - /** - * Whether a pointing stick (such as a TrackPoint) is connected. - * @private - */ - hasPointingStick_: Boolean, - - /** @private */ - hasTouchpad_: Boolean, - - /** - * Whether the device has a haptic touchpad. If this is true, - * |hasTouchpad_| will also be true. - * @private - */ - hasHapticTouchpad_: Boolean, - - /** - * |hasStylus_| is initialized to false so that dom-if behaves correctly. - * @private - */ - hasStylus_: { - type: Boolean, - value: false, + /** @private {!Map<string, string>} */ + focusConfig_: { + type: Object, + value() { + const map = new Map(); + if (routes.POINTERS) { + map.set(routes.POINTERS.path, '#pointersRow'); + } + if (routes.KEYBOARD) { + map.set(routes.KEYBOARD.path, '#keyboardRow'); + } + if (routes.STYLUS) { + map.set(routes.STYLUS.path, '#stylusRow'); + } + if (routes.DISPLAY) { + map.set(routes.DISPLAY.path, '#displayRow'); + } + if (routes.STORAGE) { + map.set(routes.STORAGE.path, '#storageRow'); + } + if (routes.EXTERNAL_STORAGE_PREFERENCES) { + map.set( + routes.EXTERNAL_STORAGE_PREFERENCES.path, + '#externalStoragePreferencesRow'); + } + if (routes.POWER) { + map.set(routes.POWER.path, '#powerRow'); + } + return map; }, + }, - /** - * Whether storage management info should be hidden. - * @private - */ - hideStorageInfo_: { - type: Boolean, - value() { - // TODO(crbug.com/868747): Show an explanatory message instead. - return loadTimeData.valueExists('isDemoSession') && - loadTimeData.getBoolean('isDemoSession'); - }, - readOnly: true, + /** @private */ + androidEnabled_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('androidEnabled'); }, + }, + }, - /** @private {!Map<string, string>} */ - focusConfig_: { - type: Object, - value() { - const map = new Map(); - if (routes.POINTERS) { - map.set(routes.POINTERS.path, '#pointersRow'); - } - if (routes.KEYBOARD) { - map.set(routes.KEYBOARD.path, '#keyboardRow'); - } - if (routes.STYLUS) { - map.set(routes.STYLUS.path, '#stylusRow'); - } - if (routes.DISPLAY) { - map.set(routes.DISPLAY.path, '#displayRow'); - } - if (routes.STORAGE) { - map.set(routes.STORAGE.path, '#storageRow'); - } - if (routes.EXTERNAL_STORAGE_PREFERENCES) { - map.set( - routes.EXTERNAL_STORAGE_PREFERENCES.path, - '#externalStoragePreferencesRow'); - } - if (routes.POWER) { - map.set(routes.POWER.path, '#powerRow'); - } - return map; - }, - }, - - /** @private */ - androidEnabled_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('androidEnabled'); - }, - }, - }; - } - - static get observers() { - return [ - 'pointersChanged_(hasMouse_, hasPointingStick_, hasTouchpad_)', - ]; - } - - constructor() { - super(); - - /** @private {!DevicePageBrowserProxy} */ - this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); - } + observers: [ + 'pointersChanged_(hasMouse_, hasPointingStick_, hasTouchpad_)', + ], /** @override */ - connectedCallback() { - super.connectedCallback(); - + attached() { this.addWebUIListener( 'has-mouse-changed', this.set.bind(this, 'hasMouse_')); this.addWebUIListener( @@ -174,17 +150,17 @@ this.addWebUIListener( 'has-haptic-touchpad-changed', this.set.bind(this, 'hasHapticTouchpad_')); - this.browserProxy_.initializePointers(); + DevicePageBrowserProxyImpl.getInstance().initializePointers(); this.addWebUIListener( 'has-stylus-changed', this.set.bind(this, 'hasStylus_')); - this.browserProxy_.initializeStylus(); + DevicePageBrowserProxyImpl.getInstance().initializeStylus(); this.addWebUIListener( 'storage-android-enabled-changed', this.set.bind(this, 'androidEnabled_')); - this.browserProxy_.updateAndroidEnabled(); - } + DevicePageBrowserProxyImpl.getInstance().updateAndroidEnabled(); + }, /** * @return {string} @@ -204,7 +180,7 @@ return this.i18n('touchpadTitle'); } return ''; - } + }, /** * Handler for tapping the mouse and touchpad settings menu item. @@ -212,7 +188,7 @@ */ onPointersTap_() { Router.getInstance().navigateTo(routes.POINTERS); - } + }, /** * Handler for tapping the Keyboard settings menu item. @@ -220,7 +196,7 @@ */ onKeyboardTap_() { Router.getInstance().navigateTo(routes.KEYBOARD); - } + }, /** * Handler for tapping the Stylus settings menu item. @@ -228,7 +204,7 @@ */ onStylusTap_() { Router.getInstance().navigateTo(routes.STYLUS); - } + }, /** * Handler for tapping the Display settings menu item. @@ -236,7 +212,7 @@ */ onDisplayTap_() { Router.getInstance().navigateTo(routes.DISPLAY); - } + }, /** * Handler for tapping the Storage settings menu item. @@ -244,7 +220,7 @@ */ onStorageTap_() { Router.getInstance().navigateTo(routes.STORAGE); - } + }, /** * Handler for tapping the Power settings menu item. @@ -252,12 +228,12 @@ */ onPowerTap_() { Router.getInstance().navigateTo(routes.POWER); - } + }, /** @protected */ currentRouteChanged() { this.checkPointerSubpage_(); - } + }, /** * @param {boolean} hasMouse @@ -268,7 +244,7 @@ pointersChanged_(hasMouse, hasPointingStick, hasTouchpad) { this.$.pointersRow.hidden = !hasMouse && !hasPointingStick && !hasTouchpad; this.checkPointerSubpage_(); - } + }, /** * Leaves the pointer subpage if all pointing devices are detached. @@ -281,7 +257,5 @@ Router.getInstance().getCurrentRoute() === routes.POINTERS) { Router.getInstance().navigateTo(routes.DEVICE); } - } -} - -customElements.define(SettingsDevicePageElement.is, SettingsDevicePageElement); + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/device_page_browser_proxy.js b/chrome/browser/resources/settings/chromeos/device_page/device_page_browser_proxy.js index dbcbccdf..6ae96c6 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/device_page_browser_proxy.js +++ b/chrome/browser/resources/settings/chromeos/device_page/device_page_browser_proxy.js
@@ -2,14 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {addWebUIListener} from 'chrome://resources/js/cr.m.js'; +// clang-format off +import { addSingletonGetter, addWebUIListener,WebUIListener} from 'chrome://resources/js/cr.m.js'; +// clang-format on -/** - * Enumeration for device state about remaining space. - * These values must be kept in sync with - * StorageManagerHandler::StorageSpaceState in C++ code. - * @enum {number} - */ + /** + * Enumeration for device state about remaining space. + * These values must be kept in sync with + * StorageManagerHandler::StorageSpaceState in C++ code. + * @enum {number} + */ export const StorageSpaceState = { NORMAL: 0, LOW: 1, @@ -29,13 +31,13 @@ return systemDisplayApi; } -/** - * @typedef {{ - * id: string, - * is_dedicated_charger: boolean, - * description: string - * }} - */ + /** + * @typedef {{ + * id: string, + * is_dedicated_charger: boolean, + * description: string + * }} + */ export let PowerSource; /** @@ -354,17 +356,6 @@ openMyFiles() { chrome.send('openMyFiles'); } - - /** @return {!DevicePageBrowserProxy} */ - static getInstance() { - return instance || (instance = new DevicePageBrowserProxyImpl()); - } - - /** @param {!DevicePageBrowserProxy} obj */ - static setInstance(obj) { - instance = obj; - } } -/** @type {?DevicePageBrowserProxy} */ -let instance = null; +addSingletonGetter(DevicePageBrowserProxyImpl);
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display.js b/chrome/browser/resources/settings/chromeos/device_page/display.js index e984ffb..6a090c2 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/display.js +++ b/chrome/browser/resources/settings/chromeos/device_page/display.js
@@ -6,7 +6,6 @@ * @fileoverview * 'settings-display' is the settings subpage for display settings. */ - import '//resources/cr_elements/cr_checkbox/cr_checkbox.m.js'; import '//resources/cr_elements/cr_link_row/cr_link_row.js'; import '//resources/cr_elements/cr_tabs/cr_tabs.js'; @@ -23,19 +22,19 @@ import '../../controls/settings_dropdown_menu.js'; import '//resources/cr_elements/cr_slider/cr_slider.js'; -import {assert} from '//resources/js/assert.m.js'; +import {assert, assertNotReached} from '//resources/js/assert.m.js'; import {focusWithoutInk} from '//resources/js/cr/ui/focus_without_ink.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js'; +import {I18nBehavior} from '//resources/js/i18n_behavior.m.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; -import {flush, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {Route} from '../../router.js'; -import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; +import {Route, Router} from '../../router.js'; +import {DeepLinkingBehavior} from '../deep_linking_behavior.js'; import {routes} from '../os_route.js'; -import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js'; -import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js'; +import {PrefsBehavior} from '../prefs_behavior.js'; +import {RouteObserverBehavior} from '../route_observer_behavior.js'; -import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, getDisplayApi} from './device_page_browser_proxy.js'; +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, getDisplayApi, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, StorageSpaceState} from './device_page_browser_proxy.js'; /** * @typedef {{ @@ -62,319 +61,298 @@ CUSTOM: 2, }; -/** - * @constructor - * @extends {PolymerElement} - * @implements {DeepLinkingBehaviorInterface} - * @implements {I18nBehaviorInterface} - * @implements {PrefsBehaviorInterface} - * @implements {RouteObserverBehaviorInterface} - */ -const SettingsDisplayElementBase = mixinBehaviors( - [DeepLinkingBehavior, I18nBehavior, PrefsBehavior, RouteObserverBehavior], - PolymerElement); +Polymer({ + _template: html`{__html_template__}`, + is: 'settings-display', -/** @polymer */ -class SettingsDisplayElement extends SettingsDisplayElementBase { - static get is() { - return 'settings-display'; - } + behaviors: [ + DeepLinkingBehavior, + I18nBehavior, + PrefsBehavior, + RouteObserverBehavior, + ], - static get template() { - return html`{__html_template__}`; - } - - static get properties() { - return { - /** - * @type {!chrome.settingsPrivate.PrefObject} - * @private - */ - selectedModePref_: { - type: Object, - value() { - return { - key: 'fakeDisplaySliderPref', - type: chrome.settingsPrivate.PrefType.NUMBER, - value: 0, - }; - }, - }, - - /** - * @type {!chrome.settingsPrivate.PrefObject} - * @private - */ - selectedZoomPref_: { - type: Object, - value() { - return { - key: 'fakeDisplaySliderZoomPref', - type: chrome.settingsPrivate.PrefType.NUMBER, - value: 0, - }; - }, - }, - - /** - * Array of displays. - * @type {!Array<!chrome.system.display.DisplayUnitInfo>} - */ - displays: Array, - - /** - * Array of display layouts. - * @type {!Array<!chrome.system.display.DisplayLayout>} - */ - layouts: Array, - - /** - * String listing the ids in displays. Used to observe changes to the - * display configuration (i.e. when a display is added or removed). - */ - displayIds: {type: String, observer: 'onDisplayIdsChanged_'}, - - /** Primary display id */ - primaryDisplayId: String, - - /** @type {!chrome.system.display.DisplayUnitInfo|undefined} */ - selectedDisplay: Object, - - /** Id passed to the overscan dialog. */ - overscanDisplayId: { - type: String, - notify: true, - }, - - /** Ids for mirroring destination displays. */ - mirroringDestinationIds: Array, - - /** @private {!Array<number>} Mode index values for slider. */ - modeValues_: Array, - - /** - * @private {!Array<SliderTick>} Display zoom slider tick - * values. - */ - zoomValues_: Array, - - /** @private {!DropdownMenuOptionList} */ - displayModeList_: { - type: Array, - value: [], - }, - - /** @private {!DropdownMenuOptionList} */ - refreshRateList_: { - type: Array, - value: [], - }, - - /** @private */ - unifiedDesktopAvailable_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('unifiedDesktopAvailable'); - } - }, - - /** @private */ - ambientColorAvailable_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('deviceSupportsAmbientColor'); - } - }, - - /** @private */ - listAllDisplayModes_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('listAllDisplayModes'); - } - }, - - /** @private */ - unifiedDesktopMode_: { - type: Boolean, - value: false, - }, - - /** - * @type {!chrome.settingsPrivate.PrefObject} - * @private - */ - selectedParentModePref_: { - type: Object, - value: function() { - return { - key: 'fakeDisplayParentModePref', - type: chrome.settingsPrivate.PrefType.NUMBER, - value: 0, - }; - }, - }, - - /** @private */ - scheduleTypesList_: { - type: Array, - value() { - return [ - { - name: loadTimeData.getString('displayNightLightScheduleNever'), - value: NightLightScheduleType.NEVER - }, - { - name: loadTimeData.getString( - 'displayNightLightScheduleSunsetToSunRise'), - value: NightLightScheduleType.SUNSET_TO_SUNRISE - }, - { - name: loadTimeData.getString('displayNightLightScheduleCustom'), - value: NightLightScheduleType.CUSTOM - } - ]; - }, - }, - - /** @private */ - shouldOpenCustomScheduleCollapse_: { - type: Boolean, - value: false, - }, - - /** @private */ - nightLightScheduleSubLabel_: String, - - /** @private */ - logicalResolutionText_: String, - - /** @private {!Array<string>} */ - displayTabNames_: Array, - - /** @private */ - selectedTab_: Number, - - /** - * Contains the settingId of any deep link that wasn't able to be shown, - * null otherwise. - * @private {?chromeos.settings.mojom.Setting} - */ - pendingSettingId_: { - type: Number, - value: null, - }, - - /** - * Used by DeepLinkingBehavior to focus this page's deep links. - * @type {!Set<!chromeos.settings.mojom.Setting>} - */ - supportedSettingIds: { - type: Object, - value: () => new Set([ - chromeos.settings.mojom.Setting.kDisplaySize, - chromeos.settings.mojom.Setting.kNightLight, - chromeos.settings.mojom.Setting.kDisplayOrientation, - chromeos.settings.mojom.Setting.kDisplayArrangement, - chromeos.settings.mojom.Setting.kDisplayResolution, - chromeos.settings.mojom.Setting.kDisplayRefreshRate, - chromeos.settings.mojom.Setting.kDisplayMirroring, - chromeos.settings.mojom.Setting.kAllowWindowsToSpanDisplays, - chromeos.settings.mojom.Setting.kAmbientColors, - chromeos.settings.mojom.Setting.kTouchscreenCalibration, - chromeos.settings.mojom.Setting.kNightLightColorTemperature, - chromeos.settings.mojom.Setting.kDisplayOverscan, - ]), - }, - - }; - } - - static get observers() { - return [ - 'updateNightLightScheduleSettings_(prefs.ash.night_light.schedule_type.*,' + - ' prefs.ash.night_light.enabled.*)', - 'onSelectedModeChange_(selectedModePref_.value)', - 'onSelectedParentModeChange_(selectedParentModePref_.value)', - 'onSelectedZoomChange_(selectedZoomPref_.value)', - 'onDisplaysChanged_(displays.*)', - - ]; - } - - /** @override */ - constructor() { - super(); - + properties: { /** - * This represents the index of the mode with the highest refresh rate at - * the current resolution. - * @private {number} - */ - this.currentSelectedParentModeIndex_ = -1; - - /** - * This is the index of the currently selected mode. - * @private {number} Selected mode index received from chrome. - */ - this.currentSelectedModeIndex_ = -1; - - /** - * Listener for chrome.system.display.onDisplayChanged events. - * @type {function(void)|undefined} + * @type {!chrome.settingsPrivate.PrefObject} * @private */ - this.displayChangedListener_ = undefined; - - /** @private {string} */ - this.invalidDisplayId_ = loadTimeData.getString('invalidDisplayId'); - - /** @private {!Route|undefined} */ - this.currentRoute_ = undefined; - - /** @private {?DevicePageBrowserProxy} */ - this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); + selectedModePref_: { + type: Object, + value() { + return { + key: 'fakeDisplaySliderPref', + type: chrome.settingsPrivate.PrefType.NUMBER, + value: 0, + }; + }, + }, /** - * Maps a parentModeIndex to the list of possible refresh rates. - * All modes have a modeIndex corresponding to the index in the selected - * display's mode list. Parent mode indexes represent the mode with the - * highest refresh rate at a given resolution. There is 1 and only 1 - * parentModeIndex for each possible resolution . - * @private {!Map<number, DropdownMenuOptionList>} + * @type {!chrome.settingsPrivate.PrefObject} + * @private */ - this.parentModeToRefreshRateMap_ = new Map(); + selectedZoomPref_: { + type: Object, + value() { + return { + key: 'fakeDisplaySliderZoomPref', + type: chrome.settingsPrivate.PrefType.NUMBER, + value: 0, + }; + }, + }, /** - * Map containing an entry for each display mode mapping its modeIndex to - * the corresponding parentModeIndex value. - * @private {!Map<number, number>} Mode index values for slider. + * Array of displays. + * @type {!Array<!chrome.system.display.DisplayUnitInfo>} */ - this.modeToParentModeMap_ = new Map(); - } + displays: Array, + + /** + * Array of display layouts. + * @type {!Array<!chrome.system.display.DisplayLayout>} + */ + layouts: Array, + + /** + * String listing the ids in displays. Used to observe changes to the + * display configuration (i.e. when a display is added or removed). + */ + displayIds: {type: String, observer: 'onDisplayIdsChanged_'}, + + /** Primary display id */ + primaryDisplayId: String, + + /** @type {!chrome.system.display.DisplayUnitInfo|undefined} */ + selectedDisplay: Object, + + /** Id passed to the overscan dialog. */ + overscanDisplayId: { + type: String, + notify: true, + }, + + /** Ids for mirroring destination displays. */ + mirroringDestinationIds: Array, + + /** @private {!Array<number>} Mode index values for slider. */ + modeValues_: Array, + + /** + * @private {!Array<SliderTick>} Display zoom slider tick + * values. + */ + zoomValues_: Array, + + /** @private {!DropdownMenuOptionList} */ + displayModeList_: { + type: Array, + value: [], + }, + + /** @private {!DropdownMenuOptionList} */ + refreshRateList_: { + type: Array, + value: [], + }, + + /** @private */ + unifiedDesktopAvailable_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('unifiedDesktopAvailable'); + } + }, + + /** @private */ + ambientColorAvailable_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('deviceSupportsAmbientColor'); + } + }, + + /** @private */ + listAllDisplayModes_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('listAllDisplayModes'); + } + }, + + /** @private */ + unifiedDesktopMode_: { + type: Boolean, + value: false, + }, + + /** + * @type {!chrome.settingsPrivate.PrefObject} + * @private + */ + selectedParentModePref_: { + type: Object, + value: function() { + return { + key: 'fakeDisplayParentModePref', + type: chrome.settingsPrivate.PrefType.NUMBER, + value: 0, + }; + }, + }, + + /** @private */ + scheduleTypesList_: { + type: Array, + value() { + return [ + { + name: loadTimeData.getString('displayNightLightScheduleNever'), + value: NightLightScheduleType.NEVER + }, + { + name: loadTimeData.getString( + 'displayNightLightScheduleSunsetToSunRise'), + value: NightLightScheduleType.SUNSET_TO_SUNRISE + }, + { + name: loadTimeData.getString('displayNightLightScheduleCustom'), + value: NightLightScheduleType.CUSTOM + } + ]; + }, + }, + + /** @private */ + shouldOpenCustomScheduleCollapse_: { + type: Boolean, + value: false, + }, + + /** @private */ + nightLightScheduleSubLabel_: String, + + /** @private */ + logicalResolutionText_: String, + + /** @private {!Array<string>} */ + displayTabNames_: Array, + + /** @private */ + selectedTab_: Number, + + /** + * Contains the settingId of any deep link that wasn't able to be shown, + * null otherwise. + * @private {?chromeos.settings.mojom.Setting} + */ + pendingSettingId_: { + type: Number, + value: null, + }, + + /** + * Used by DeepLinkingBehavior to focus this page's deep links. + * @type {!Set<!chromeos.settings.mojom.Setting>} + */ + supportedSettingIds: { + type: Object, + value: () => new Set([ + chromeos.settings.mojom.Setting.kDisplaySize, + chromeos.settings.mojom.Setting.kNightLight, + chromeos.settings.mojom.Setting.kDisplayOrientation, + chromeos.settings.mojom.Setting.kDisplayArrangement, + chromeos.settings.mojom.Setting.kDisplayResolution, + chromeos.settings.mojom.Setting.kDisplayRefreshRate, + chromeos.settings.mojom.Setting.kDisplayMirroring, + chromeos.settings.mojom.Setting.kAllowWindowsToSpanDisplays, + chromeos.settings.mojom.Setting.kAmbientColors, + chromeos.settings.mojom.Setting.kTouchscreenCalibration, + chromeos.settings.mojom.Setting.kNightLightColorTemperature, + chromeos.settings.mojom.Setting.kDisplayOverscan, + ]), + }, + }, + + observers: [ + 'updateNightLightScheduleSettings_(prefs.ash.night_light.schedule_type.*,' + + ' prefs.ash.night_light.enabled.*)', + 'onSelectedModeChange_(selectedModePref_.value)', + 'onSelectedParentModeChange_(selectedParentModePref_.value)', + 'onSelectedZoomChange_(selectedZoomPref_.value)', + 'onDisplaysChanged_(displays.*)', + ], + + /** + * This represents the index of the mode with the highest refresh rate at + * the current resolution. + * @private {number} + */ + currentSelectedParentModeIndex_: -1, + + /** + * This is the index of the currently selected mode. + * @private {number} Selected mode index received from chrome. + */ + currentSelectedModeIndex_: -1, + + /** + * Listener for chrome.system.display.onDisplayChanged events. + * @type {function(void)|undefined} + * @private + */ + displayChangedListener_: undefined, + + /** @private {?DevicePageBrowserProxy} */ + browserProxy_: null, + + /** @private {string} */ + invalidDisplayId_: loadTimeData.getString('invalidDisplayId'), + + /** @private {!Route|undefined} */ + currentRoute_: undefined, + + /** + * Maps a parentModeIndex to the list of possible refresh rates. + * All modes have a modeIndex corresponding to the index in the selected + * display's mode list. Parent mode indexes represent the mode with the + * highest refresh rate at a given resolution. There is 1 and only 1 + * parentModeIndex for each possible resolution . + * @private {!Map<number, DropdownMenuOptionList>} + */ + parentModeToRefreshRateMap_: new Map(), + + /** + * Map containing an entry for each display mode mapping its modeIndex to + * the corresponding parentModeIndex value. + * @private {!Map<number, number>} Mode index values for slider. + */ + modeToParentModeMap_: new Map(), /** @override */ - connectedCallback() { - super.connectedCallback(); + created() { + this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); + }, + /** @override */ + attached() { this.displayChangedListener_ = this.displayChangedListener_ || (() => this.getDisplayInfo_()); getDisplayApi().onDisplayChanged.addListener(this.displayChangedListener_); this.getDisplayInfo_(); this.$.displaySizeSlider.updateValueInstantly = false; - } + }, /** @override */ - disconnectedCallback() { - super.disconnectedCallback(); - + detached() { getDisplayApi().onDisplayChanged.removeListener( assert(this.displayChangedListener_)); this.currentSelectedModeIndex_ = -1; this.currentSelectedParentModeIndex_ = -1; - } + }, /** * Overridden from DeepLinkingBehavior. @@ -391,23 +369,23 @@ // Continue with deep link attempt. return true; - } + }, /** - * @param {!Route} newRoute - * @param {!Route=} opt_oldRoute + * @param {!Route|undefined} opt_newRoute + * @param {!Route|undefined} opt_oldRoute */ - currentRouteChanged(newRoute, opt_oldRoute) { - this.currentRoute_ = newRoute; + currentRouteChanged(opt_newRoute, opt_oldRoute) { + this.currentRoute_ = opt_newRoute; // When navigating away from the page, deselect any selected display. - if (newRoute !== routes.DISPLAY && opt_oldRoute === routes.DISPLAY) { + if (opt_newRoute !== routes.DISPLAY && opt_oldRoute === routes.DISPLAY) { this.browserProxy_.highlightDisplay(this.invalidDisplayId_); return; } // Does not apply to this page. - if (newRoute !== routes.DISPLAY) { + if (opt_newRoute !== routes.DISPLAY) { this.pendingSettingId_ = null; return; } @@ -419,7 +397,7 @@ this.pendingSettingId_ = result.pendingSettingId; } }); - } + }, /** * Shows or hides the overscan dialog. @@ -433,14 +411,14 @@ } else { this.$.displayOverscan.close(); } - } + }, /** @private */ onDisplayIdsChanged_() { // Close any overscan dialog (which will cancel any overscan operation) // if displayIds changes. this.showOverscanDialog_(false); - } + }, /** @private */ getDisplayInfo_() { @@ -449,7 +427,7 @@ }; getDisplayApi().getInfo( flags, displays => this.displayInfoFetched_(displays)); - } + }, /** * @param {!Array<!chrome.system.display.DisplayUnitInfo>} displays @@ -466,7 +444,7 @@ } else { this.mirroringDestinationIds = []; } - } + }, /** * @param {!Array<!chrome.system.display.DisplayUnitInfo>} displays @@ -478,7 +456,7 @@ this.displays = displays; this.displayTabNames_ = displays.map(({name}) => name); this.updateDisplayInfo_(); - } + }, /** * @param {!chrome.system.display.DisplayUnitInfo} selectedDisplay @@ -493,7 +471,7 @@ } } return 0; - } + }, /** * Checks if the given device policy is enabled. @@ -503,7 +481,7 @@ */ isDevicePolicyEnabled_(policyPref) { return policyPref !== undefined && policyPref.value !== null; - } + }, /** * Checks if display resolution is managed by device policy. @@ -516,7 +494,7 @@ (resolutionPref.value.external_use_native !== undefined || (resolutionPref.value.external_width !== undefined && resolutionPref.value.external_height !== undefined)); - } + }, /** * Checks if display resolution is managed by policy and the policy @@ -528,7 +506,7 @@ isDisplayResolutionMandatory_(resolutionPref) { return this.isDisplayResolutionManagedByPolicy_(resolutionPref) && !resolutionPref.value.recommended; - } + }, /** * Checks if display scale factor is managed by device policy. @@ -545,7 +523,7 @@ return resolutionPref.value.internal_scale_percentage !== undefined; } return resolutionPref.value.external_scale_percentage !== undefined; - } + }, /** * Checks if display scale factor is managed by policy and the policy @@ -558,7 +536,7 @@ return this.isDisplayScaleManagedByPolicy_( selectedDisplay, resolutionPref) && !resolutionPref.value.recommended; - } + }, /** @@ -587,7 +565,7 @@ }); } this.displayModeList_ = optionList; - } + }, /** * Uses the modes of |selectedDisplay| to build a nested map of width => @@ -622,7 +600,7 @@ modes.get(mode.width).get(mode.height).set(mode.refreshRate, i); } return modes; - } + }, /** * Parses the display modes for |selectedDisplay|. |displayModeList_| will @@ -687,7 +665,7 @@ // Use the new sort order. this.sortResolutionList_(); - } + }, /** * Picks the appropriate parent mode from a refresh rate -> mode index map. @@ -699,7 +677,7 @@ getParentModeIndex_(refreshRates) { const maxRefreshRate = Math.max(...refreshRates.keys()); return refreshRates.get(maxRefreshRate); - } + }, /** * Adds a an entry in |displayModeList_| for the resolution represented by @@ -726,7 +704,7 @@ name: resolutionOption, value: parentModeIndex, }); - } + }, /** * Adds a an entry in |parentModeToRefreshRateMap_| for the refresh rate @@ -756,7 +734,7 @@ name: refreshRateOption, value: modeIndex, }); - } + }, /** * Sorts |displayModeList_| in descending order. First order sort is width, @@ -775,7 +753,7 @@ getWidthFromResolutionString(second.name); }) .reverse(); - } + }, /** * Parses display modes for |selectedDisplay|. A 'mode' is a resolution + @@ -791,7 +769,7 @@ } else { this.parseCompoundDisplayModes_(selectedDisplay); } - } + }, /** * Returns a value from |zoomValues_| that is closest to the display zoom @@ -814,7 +792,7 @@ } return /** @type {number} */ (closestMatch); - } + }, /** * Given the display with the current display mode, this function lists all @@ -831,7 +809,7 @@ label: this.i18n('displayZoomValue', ariaValue.toString()) }; }); - } + }, /** * We need to call this explicitly rather than relying on change events @@ -888,7 +866,7 @@ this.updateLogicalResolutionText_( /** @type {number} */ (this.selectedZoomPref_.value)); - } + }, /** * Returns true if the resolution setting needs to be displayed. @@ -898,7 +876,7 @@ */ showDropDownResolutionSetting_(display) { return !display.isInternal; - } + }, /** * Returns true if the refresh rate setting needs to be displayed. @@ -909,7 +887,7 @@ showRefreshRateSetting_(display) { return this.listAllDisplayModes_ && this.showDropDownResolutionSetting_(display); - } + }, /** * Returns true if external touch devices are connected and the current @@ -923,7 +901,7 @@ showTouchCalibrationSetting_(display) { return !display.isInternal && loadTimeData.getBoolean('enableTouchCalibrationSetting'); - } + }, /** * Returns true if the overscan setting should be shown for |display|. @@ -933,7 +911,7 @@ */ showOverscanSetting_(display) { return !display.isInternal; - } + }, /** * Returns true if the ambient color setting should be shown for |display|. @@ -944,7 +922,7 @@ */ showAmbientColorSetting_(ambientColorAvailable, display) { return ambientColorAvailable && display && display.isInternal; - } + }, /** * @return {boolean} @@ -952,7 +930,7 @@ */ hasMultipleDisplays_() { return this.displays.length > 1; - } + }, /** * Returns false if the display select menu has to be hidden. @@ -967,7 +945,7 @@ } return false; - } + }, /** * Returns the select menu index indicating whether the display currently is @@ -982,7 +960,7 @@ return 0; } return 1; - } + }, /** * Returns the i18n string for the text to be used for mirroring settings. @@ -992,7 +970,7 @@ */ getDisplayMirrorText_(displays) { return this.i18n('displayMirror', displays[0].name); - } + }, /** * @param {boolean} unifiedDesktopAvailable @@ -1009,7 +987,7 @@ return unifiedDesktopMode || (unifiedDesktopAvailable && displays.length > 1 && !this.isMirrored_(displays)); - } + }, /** * @param {boolean} unifiedDesktopMode @@ -1020,7 +998,7 @@ return this.i18n( unifiedDesktopMode ? 'displayUnifiedDesktopOn' : 'displayUnifiedDesktopOff'); - } + }, /** * @param {boolean} unifiedDesktopMode @@ -1035,7 +1013,7 @@ return this.isMirrored_(displays) || (!unifiedDesktopMode && displays.length > 1); - } + }, /** * @param {!Array<!chrome.system.display.DisplayUnitInfo>} displays @@ -1045,7 +1023,7 @@ isMirrored_(displays) { return displays !== undefined && displays.length > 0 && !!displays[0].mirroringSourceId; - } + }, /** * @param {!chrome.system.display.DisplayUnitInfo} display @@ -1055,7 +1033,7 @@ */ isSelected_(display, selectedDisplay) { return display.id === selectedDisplay.id; - } + }, /** * @param {!chrome.system.display.DisplayUnitInfo} selectedDisplay @@ -1064,7 +1042,7 @@ */ enableSetResolution_(selectedDisplay) { return selectedDisplay.modes.length > 1; - } + }, /** * @param {!chrome.system.display.DisplayUnitInfo} selectedDisplay @@ -1073,7 +1051,7 @@ */ enableDisplayZoomSlider_(selectedDisplay) { return selectedDisplay.availableDisplayZoomFactors.length > 1; - } + }, /** * Returns true if the given mode is the best mode for the @@ -1096,7 +1074,7 @@ } return mode.uiScale === 1.0; - } + }, /** * @return {string} @@ -1122,7 +1100,7 @@ return this.i18n('displayResolutionTextNative', widthStr, heightStr); } return this.i18n('displayResolutionText', widthStr, heightStr); - } + }, /** * Updates the logical resolution text to be used for the display size @@ -1158,7 +1136,7 @@ } this.logicalResolutionText_ = this.i18n(logicalResolutionStrId, widthStr, heightStr); - } + }, /** * Determines whether width and height should be swapped in the @@ -1173,7 +1151,7 @@ return bounds.width > bounds.height !== mode.widthInNativePixels > mode.heightInNativePixels; - } + }, /** @@ -1191,7 +1169,7 @@ const zoomFactor = this.$.displaySizeSlider.ticks[sliderValue].value; this.updateLogicalResolutionText_( /** @type {number} */ (zoomFactor)); - } + }, /** * @param {!CustomEvent<string>} e |e.detail| is the id of the selected @@ -1209,15 +1187,15 @@ return; } } - } + }, /** @private */ onSelectDisplayTab_() { - const {selected} = this.shadowRoot.querySelector('cr-tabs'); + const {selected} = this.$$('cr-tabs'); if (this.selectedTab_ !== selected) { this.setSelectedDisplay_(this.displays[selected]); } - } + }, /** * Handles event when a touch calibration option is selected. @@ -1226,7 +1204,7 @@ */ onTouchCalibrationTap_(e) { getDisplayApi().showNativeTouchCalibration(this.selectedDisplay.id); - } + }, /** * Handles the event when an option from display select menu is selected. @@ -1251,7 +1229,7 @@ getDisplayApi().setDisplayProperties( this.selectedDisplay.id, properties, () => this.setPropertiesCallback_()); - } + }, /** * Handles a change in the |selectedParentModePref| value triggered via the @@ -1272,7 +1250,7 @@ // Reset |selectedModePref| to the parentMode. this.set('selectedModePref_.value', this.selectedParentModePref_.value); - } + }, /** * Returns True if a new parentMode has been set and we have received an @@ -1287,7 +1265,7 @@ return this.currentSelectedParentModeIndex_ !== this.selectedParentModePref_.value; - } + }, /** * Returns True if a new mode has been set and we have received an update @@ -1306,7 +1284,7 @@ } return this.currentSelectedModeIndex_ !== this.selectedModePref_.value; - } + }, /** * Handles a change in |selectedModePref| triggered via the observer. @@ -1335,7 +1313,7 @@ getDisplayApi().setDisplayProperties( this.selectedDisplay.id, properties, () => this.setPropertiesCallback_()); - } + }, /** * Triggerend when the display size slider changes its value. This only @@ -1356,7 +1334,7 @@ getDisplayApi().setDisplayProperties( this.selectedDisplay.id, properties, () => this.setPropertiesCallback_()); - } + }, /** * Returns whether the option "Auto-rotate" is one of the shown options in @@ -1367,7 +1345,7 @@ */ showAutoRotateOption_(selectedDisplay) { return selectedDisplay.isAutoRotationAllowed; - } + }, /** * @param {!Event} event @@ -1385,7 +1363,7 @@ getDisplayApi().setDisplayProperties( this.selectedDisplay.id, properties, () => this.setPropertiesCallback_()); - } + }, /** @private */ onMirroredTap_(event) { @@ -1405,7 +1383,7 @@ console.error('setMirrorMode Error: ' + error.message); } }); - } + }, /** @private */ onUnifiedDesktopTap_() { @@ -1414,7 +1392,7 @@ }; getDisplayApi().setDisplayProperties( this.primaryDisplayId, properties, () => this.setPropertiesCallback_()); - } + }, /** * @param {!Event} e @@ -1424,12 +1402,12 @@ e.preventDefault(); this.overscanDisplayId = this.selectedDisplay.id; this.showOverscanDialog_(true); - } + }, /** @private */ onCloseOverscanDialog_() { - focusWithoutInk(assert(this.shadowRoot.querySelector('#overscan'))); - } + focusWithoutInk(assert(this.$$('#overscan'))); + }, /** @private */ updateDisplayInfo_() { @@ -1467,7 +1445,7 @@ this.pendingSettingId_ = null; } }); - } + }, /** @private */ setPropertiesCallback_() { @@ -1475,7 +1453,7 @@ console.error( 'setDisplayProperties Error: ' + chrome.runtime.lastError.message); } - } + }, /** * Invoked when the status of Night Light or its schedule type are changed, @@ -1496,7 +1474,7 @@ } else { this.nightLightScheduleSubLabel_ = ''; } - } + }, /** * @return {boolean} @@ -1507,17 +1485,15 @@ return false; } return this.hasMultipleDisplays_() || this.isMirrored_(this.displays); - } + }, /** @private */ onDisplaysChanged_() { flush(); - const displayLayout = this.shadowRoot.querySelector('#displayLayout'); + const displayLayout = this.$$('#displayLayout'); if (displayLayout) { displayLayout.updateDisplays( this.displays, this.layouts, this.mirroringDestinationIds); } - } -} - -customElements.define(SettingsDisplayElement.is, SettingsDisplayElement); + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display_layout.js b/chrome/browser/resources/settings/chromeos/device_page/display_layout.js index 5a7a737..7b4f666 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/display_layout.js +++ b/chrome/browser/resources/settings/chromeos/device_page/display_layout.js
@@ -8,17 +8,6 @@ * more displays and allows them to be arranged. */ -import '//resources/polymer/v3_0/paper-styles/shadow.js'; -import '../../settings_shared_css.js'; - -import {loadTimeData} from '//resources/js/load_time_data.m.js'; -import {IronResizableBehavior} from '//resources/polymer/v3_0/iron-resizable-behavior/iron-resizable-behavior.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl} from './device_page_browser_proxy.js'; -import {DragBehavior, DragBehaviorInterface, DragPosition} from './drag_behavior.js'; -import {LayoutBehavior, LayoutBehaviorInterface} from './layout_behavior.js'; - /** * Container for DisplayUnitInfo. Mostly here to make the DisplaySelectEvent * typedef more readable. @@ -32,91 +21,86 @@ */ let DisplaySelectEvent; +import {afterNextRender, Polymer, html, flush, Templatizer, TemplateInstanceBase} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {IronResizableBehavior} from '//resources/polymer/v3_0/iron-resizable-behavior/iron-resizable-behavior.js'; +import '//resources/polymer/v3_0/paper-styles/shadow.js'; +import {loadTimeData} from '//resources/js/load_time_data.m.js'; +import {DragBehavior, DragPosition} from './drag_behavior.js'; +import {LayoutBehavior} from './layout_behavior.js'; +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, getDisplayApi, StorageSpaceState} from './device_page_browser_proxy.js'; +import '../../settings_shared_css.js'; + + /** @type {number} */ const MIN_VISUAL_SCALE = .01; -/** - * @constructor - * @extends {PolymerElement} - * @implements {DragBehaviorInterface} - * @implements {LayoutBehaviorInterface} - */ -const DisplayLayoutElementBase = mixinBehaviors( - [IronResizableBehavior, DragBehavior, LayoutBehavior], PolymerElement); +Polymer({ + _template: html`{__html_template__}`, + is: 'display-layout', -/** @polymer */ -class DisplayLayoutElement extends DisplayLayoutElementBase { - static get is() { - return 'display-layout'; - } + behaviors: [ + IronResizableBehavior, + DragBehavior, + LayoutBehavior, + ], - static get template() { - return html`{__html_template__}`; - } + properties: { + /** + * Array of displays. + * @type {!Array<!chrome.system.display.DisplayUnitInfo>} + */ + displays: Array, - static get properties() { - return { - /** - * Array of displays. - * @type {!Array<!chrome.system.display.DisplayUnitInfo>} - */ - displays: Array, - - /** @type {!chrome.system.display.DisplayUnitInfo|undefined} */ - selectedDisplay: Object, - - /** - * The ratio of the display area div (in px) to DisplayUnitInfo.bounds. - * @type {number} - */ - visualScale: { - type: Number, - value: 1, - }, - - /** - * Ids for mirroring destination displays. - * @type {!Array<string>|undefined} - * @private - */ - mirroringDestinationIds_: Array, - }; - } - - /** @override */ - constructor() { - super(); - - /** @private {!{left: number, top: number}} */ - this.visualOffset_ = {left: 0, top: 0}; + /** @type {!chrome.system.display.DisplayUnitInfo|undefined} */ + selectedDisplay: Object, /** - * Stores the previous coordinates of a display once dragging starts. Used - * to calculate the delta during each step of the drag. Null when there is - * no drag in progress. - * @private {?{x: number, y: number}} + * The ratio of the display area div (in px) to DisplayUnitInfo.bounds. + * @type {number} */ - this.lastDragCoordinates_ = null; + visualScale: { + type: Number, + value: 1, + }, - /** @private {?DevicePageBrowserProxy} */ - this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); + /** + * Ids for mirroring destination displays. + * @type {!Array<string>|undefined} + * @private + */ + mirroringDestinationIds_: Array, + }, - /** @private {boolean} */ - this.allowDisplayAlignmentApi_ = - loadTimeData.getBoolean('allowDisplayAlignmentApi'); + /** @private {!{left: number, top: number}} */ + visualOffset_: {left: 0, top: 0}, - /** @private {string} */ - this.invalidDisplayId_ = loadTimeData.getString('invalidDisplayId'); + /** + * Stores the previous coordinates of a display once dragging starts. Used to + * calculate the delta during each step of the drag. Null when there is no + * drag in progress. + * @private {?{x: number, y: number}} + */ + lastDragCoordinates_: null, - /** @private {boolean} */ - this.hasDragStarted_ = false; - } + /** @private {?DevicePageBrowserProxy} */ + browserProxy_: null, + + /** @private {boolean} */ + allowDisplayAlignmentApi_: + loadTimeData.getBoolean('allowDisplayAlignmentApi'), + + /** @private {string} */ + invalidDisplayId_: loadTimeData.getString('invalidDisplayId'), /** @override */ - disconnectedCallback() { - super.disconnectedCallback(); + created() { + this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); + }, + /** @override */ + detached() { this.initializeDrag(false); - } + }, /** * Called explicitly when |this.displays| and their associated |this.layouts| @@ -146,7 +130,7 @@ this.initializeDrag( !this.mirroring, this.$.displayArea, (id, amount) => this.onDrag_(id, amount)); - } + }, /** * Calculates the visual offset and scale for the display area @@ -209,7 +193,7 @@ this.visualScale = Math.max(MIN_VISUAL_SCALE, scale); return true; - } + }, /** * @param {string} id @@ -239,7 +223,7 @@ Math.round(this.visualOffset_.top + (bounds.top * this.visualScale)); return 'height: ' + height + 'px; width: ' + width + 'px;' + ' left: ' + left + 'px; top: ' + top + 'px'; - } + }, /** * @param {number} mirroringDestinationIndex @@ -258,7 +242,7 @@ return this.getDivStyle_( displays[0].id, displays[0].bounds, visualScale, (mirroringDestinationDisplayNum - mirroringDestinationIndex) * -4); - } + }, /** * @param {!chrome.system.display.DisplayUnitInfo} display @@ -268,7 +252,7 @@ */ isSelected_(display, selectedDisplay) { return display.id === selectedDisplay.id; - } + }, focusSelectedDisplay_() { if (!this.selectedDisplay) { @@ -280,31 +264,27 @@ if (selected) { selected.focus(); } - } + }, /** * @param {!DisplaySelectEvent} e * @private */ onSelectDisplayTap_(e) { - const selectDisplayEvent = new CustomEvent( - 'select-display', {composed: true, detail: e.model.item.id}); - this.dispatchEvent(selectDisplayEvent); + this.fire('select-display', e.model.item.id); // Force active in case the selected display was clicked. // TODO(dpapad): Ask @stevenjb, why are we setting 'active' on a div? e.target.active = true; - } + }, /** * @param {!DisplaySelectEvent} e * @private */ onFocus_(e) { - const selectDisplayEvent = new CustomEvent( - 'select-display', {composed: true, detail: e.model.item.id}); - this.dispatchEvent(selectDisplayEvent); + this.fire('select-display', e.model.item.id); this.focusSelectedDisplay_(); - } + }, /** * @param {string} id @@ -324,9 +304,7 @@ this.browserProxy_.highlightDisplay(id); // Make sure the dragged display is also selected. if (id !== this.selectedDisplay.id) { - const selectDisplayEvent = - new CustomEvent('select-display', {composed: true, detail: id}); - this.dispatchEvent(selectDisplayEvent); + this.fire('select-display', id); } const calculatedBounds = this.getCalculatedDisplayBounds(id); @@ -367,11 +345,10 @@ this.visualOffset_.left + Math.round(newBounds.left * this.visualScale); const top = this.visualOffset_.top + Math.round(newBounds.top * this.visualScale); - const div = this.shadowRoot.querySelector('#_' + id); + const div = this.$$('#_' + id); div.style.left = '' + left + 'px'; div.style.top = '' + top + 'px'; this.focusSelectedDisplay_(); - } -} + }, -customElements.define(DisplayLayoutElement.is, DisplayLayoutElement); +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.js b/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.js index 4083c33..963e042 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.js +++ b/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.js
@@ -16,46 +16,32 @@ import '../os_icons.js'; import '../../settings_shared_css.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getDisplayApi} from './device_page_browser_proxy.js'; +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, getDisplayApi, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, StorageSpaceState} from './device_page_browser_proxy.js'; -/** @polymer */ -class SettingsDisplayOverscanDialogElement extends PolymerElement { - static get is() { - return 'settings-display-overscan-dialog'; - } +Polymer({ + _template: html`{__html_template__}`, + is: 'settings-display-overscan-dialog', - static get template() { - return html`{__html_template__}`; - } + properties: { + /** Id of the display for which overscan is being applied (or empty). */ + displayId: { + type: String, + notify: true, + observer: 'displayIdChanged_', + }, - static get properties() { - return { - /** Id of the display for which overscan is being applied (or empty). */ - displayId: { - type: String, - notify: true, - observer: 'displayIdChanged_', - }, + /** Set to true once changes are saved to avoid a reset/cancel on close. */ + committed_: Boolean, + }, - /** - Set to true once changes are saved to avoid a reset/cancel on close. - */ - committed_: Boolean, - }; - } - - constructor() { - super(); - - /** - * Keyboard event handler for overscan adjustments. - * @type {?function(!Event)} - * @private - */ - this.keyHandler_ = null; - } + /** + * Keyboard event handler for overscan adjustments. + * @type {?function(!Event)} + * @private + */ + keyHandler_: null, open() { this.keyHandler_ = this.handleKeyEvent_.bind(this); @@ -65,8 +51,8 @@ this.committed_ = false; this.$.dialog.showModal(); // Don't focus 'reset' by default. 'Tab' will focus 'OK'. - this.shadowRoot.querySelector('#reset').blur(); - } + this.$$('#reset').blur(); + }, close() { window.removeEventListener('keydown', this.keyHandler_); @@ -76,7 +62,7 @@ if (this.$.dialog.open) { this.$.dialog.close(); } - } + }, /** @private */ displayIdChanged_(newValue, oldValue) { @@ -89,19 +75,19 @@ } this.committed_ = false; getDisplayApi().overscanCalibrationStart(newValue); - } + }, /** @private */ onResetTap_() { getDisplayApi().overscanCalibrationReset(this.displayId); - } + }, /** @private */ onSaveTap_() { getDisplayApi().overscanCalibrationComplete(this.displayId); this.committed_ = true; this.close(); - } + }, /** * @param {!Event} event @@ -145,7 +131,7 @@ return; } event.preventDefault(); - } + }, /** * @param {number} x @@ -160,7 +146,7 @@ bottom: y ? -y : 0, }; getDisplayApi().overscanCalibrationAdjust(this.displayId, delta); - } + }, /** * @param {number} x @@ -176,8 +162,4 @@ }; getDisplayApi().overscanCalibrationAdjust(this.displayId, delta); } -} - -customElements.define( - SettingsDisplayOverscanDialogElement.is, - SettingsDisplayOverscanDialogElement); +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/drag_behavior.js b/chrome/browser/resources/settings/chromeos/device_page/drag_behavior.js index 459f688..a5e7eed 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/drag_behavior.js +++ b/chrome/browser/resources/settings/chromeos/device_page/drag_behavior.js
@@ -2,13 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// clang-format off +import {assert, assertInstanceof} from 'chrome://resources/js/assert.m.js'; +// clang-format on + /** * @fileoverview Behavior for handling dragging elements in a container. * Draggable elements must have the 'draggable' attribute set. */ -import {assert, assertInstanceof} from 'chrome://resources/js/assert.m.js'; - /** * @typedef {{ * x: number, @@ -409,24 +411,3 @@ } }, }; - -/** @interface */ -export class DragBehaviorInterface { - constructor() { - /** @type {boolean} */ - this.dragEnabled; - - /** @type {boolean} */ - this.keyboardDragEnabled; - - /** @type {number} */ - this.keyboardDragStepSize; - } - - /** - * @param {boolean} enabled - * @param {(HTMLDivElement|Element)=} opt_container - * @param {!function(string, ?DragPosition):void=} opt_callback - */ - initializeDrag(enabled, opt_container, opt_callback) {} -}
diff --git a/chrome/browser/resources/settings/chromeos/device_page/keyboard.js b/chrome/browser/resources/settings/chromeos/device_page/keyboard.js index 65a9fd7..ec2f375 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/keyboard.js +++ b/chrome/browser/resources/settings/chromeos/device_page/keyboard.js
@@ -38,6 +38,7 @@ ASSISTANT_KEY: 7, }; + Polymer({ _template: html`{__html_template__}`, is: 'settings-keyboard',
diff --git a/chrome/browser/resources/settings/chromeos/device_page/layout_behavior.js b/chrome/browser/resources/settings/chromeos/device_page/layout_behavior.js index 8a7c1d3b..992bfd7a 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/layout_behavior.js +++ b/chrome/browser/resources/settings/chromeos/device_page/layout_behavior.js
@@ -2,15 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// clang-format off +import {assert} from 'chrome://resources/js/assert.m.js'; +import {getDisplayApi} from './device_page_browser_proxy.js'; +// clang-format on + /** * @fileoverview Behavior for handling display layout, specifically * edge snapping and collisions. */ -import {assert} from 'chrome://resources/js/assert.m.js'; - -import {getDisplayApi} from './device_page_browser_proxy.js'; - /** @polymerBehavior */ export const LayoutBehavior = { properties: { @@ -732,49 +733,3 @@ } }, }; - -/** @interface */ -export class LayoutBehaviorInterface { - constructor() { - /** - * Array of display layouts. - * @type {!Array<!chrome.system.display.DisplayLayout>} - */ - this.layouts; - - /** - * Whether or not mirroring is enabled. - * @type {boolean} - */ - this.mirroring; - } - - /** - * @param {!Array<!chrome.system.display.DisplayUnitInfo>} displays - * @param {!Array<!chrome.system.display.DisplayLayout>} layouts - */ - initializeDisplayLayout(displays, layouts) {} - - - /** - * Called when a drag event occurs. Checks collisions and updates the layout. - * @param {string} id - * @param {!chrome.system.display.Bounds} newBounds The new calculated - * bounds for the display. - * @return {!chrome.system.display.Bounds} - */ - updateDisplayBounds(id, newBounds) {} - - /** - * Called when dragging ends. Sends the updated layout to chrome. - * @param {string} id - */ - finishUpdateDisplayBounds(id) {} - - /** - * @param {string} displayId - * @param {boolean=} opt_notest Set to true if bounds may not be set. - * @return {!chrome.system.display.Bounds} bounds - */ - getCalculatedDisplayBounds(displayId, opt_notest) {} -}
diff --git a/chrome/browser/resources/settings/chromeos/device_page/pointers.js b/chrome/browser/resources/settings/chromeos/device_page/pointers.js index eb18a84..ebd7b01f 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/pointers.js +++ b/chrome/browser/resources/settings/chromeos/device_page/pointers.js
@@ -16,171 +16,158 @@ import '//resources/cr_elements/cr_slider/cr_slider.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {Route} from '../../router.js'; -import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; +import {Route, Router} from '../../router.js'; +import {DeepLinkingBehavior} from '../deep_linking_behavior.js'; import {routes} from '../os_route.js'; -import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js'; -import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js'; +import {PrefsBehavior} from '../prefs_behavior.js'; +import {RouteObserverBehavior} from '../route_observer_behavior.js'; -/** - * @constructor - * @extends {PolymerElement} - * @implements {DeepLinkingBehaviorInterface} - * @implements {PrefsBehaviorInterface} - * @implements {RouteObserverBehaviorInterface} - */ -const SettingsPointersElementBase = mixinBehaviors( - [DeepLinkingBehavior, PrefsBehavior, RouteObserverBehavior], - PolymerElement); +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, getDisplayApi, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, StorageSpaceState} from './device_page_browser_proxy.js'; -/** @polymer */ -class SettingsPointersElement extends SettingsPointersElementBase { - static get is() { - return 'settings-pointers'; - } +Polymer({ + _template: html`{__html_template__}`, + is: 'settings-pointers', - static get template() { - return html`{__html_template__}`; - } + behaviors: [ + DeepLinkingBehavior, + PrefsBehavior, + RouteObserverBehavior, + ], - static get properties() { - return { - prefs: { - type: Object, - notify: true, + properties: { + prefs: { + type: Object, + notify: true, + }, + + hasMouse: Boolean, + + hasPointingStick: Boolean, + + hasTouchpad: Boolean, + + hasHapticTouchpad: Boolean, + + swapPrimaryOptions: { + readOnly: true, + type: Array, + value() { + return [ + { + value: false, + name: loadTimeData.getString('primaryMouseButtonLeft') + }, + { + value: true, + name: loadTimeData.getString('primaryMouseButtonRight') + }, + ]; }, + }, - hasMouse: Boolean, + showHeadings_: { + type: Boolean, + computed: 'computeShowHeadings_(hasMouse, hasPointingStick, hasTouchpad)', + }, - hasPointingStick: Boolean, + subsectionClass_: { + type: String, + computed: 'computeSubsectionClass_(hasMouse, hasPointingStick, ' + + 'hasTouchpad)', + }, - hasTouchpad: Boolean, + /** + * TODO(michaelpg): settings-slider should optionally take a min and max so + * we don't have to generate a simple range of natural numbers ourselves. + * These values match the TouchpadSensitivity enum in enums.xml. + * @type {!Array<number>} + * @private + */ + sensitivityValues_: { + type: Array, + value: [1, 2, 3, 4, 5], + readOnly: true, + }, - hasHapticTouchpad: Boolean, - - swapPrimaryOptions: { - readOnly: true, - type: Array, - value() { - return [ - { - value: false, - name: loadTimeData.getString('primaryMouseButtonLeft') - }, - { - value: true, - name: loadTimeData.getString('primaryMouseButtonRight') - }, - ]; - }, + /** + * The click sensitivity values from prefs are [1,3,5] but ChromeVox needs + * to announce them as [1,2,3]. + * @type {!Array<SliderTick>} + * @private + */ + hapticClickSensitivityValues_: { + type: Array, + value() { + return [ + {value: 1, ariaValue: 1}, + {value: 3, ariaValue: 2}, + {value: 5, ariaValue: 3}, + ]; }, + readOnly: true, + }, - showHeadings_: { - type: Boolean, - computed: - 'computeShowHeadings_(hasMouse, hasPointingStick, hasTouchpad)', + /** + * TODO(khorimoto): Remove this conditional once the feature is launched. + * @private + */ + allowScrollSettings_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('allowScrollSettings'); }, + }, - subsectionClass_: { - type: String, - computed: 'computeSubsectionClass_(hasMouse, hasPointingStick, ' + - 'hasTouchpad)', + /** + * TODO(gavinwill): Remove this conditional once the feature is launched. + * @private + */ + allowTouchpadHapticFeedback_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('allowTouchpadHapticFeedback'); }, + }, - /** - * TODO(michaelpg): settings-slider should optionally take a min and max - * so we don't have to generate a simple range of natural numbers - * ourselves. These values match the TouchpadSensitivity enum in - * enums.xml. - * @type {!Array<number>} - * @private - */ - sensitivityValues_: { - type: Array, - value: [1, 2, 3, 4, 5], - readOnly: true, + /** + * TODO(gavinwill): Remove this conditional once the feature is launched. + * @private + */ + allowTouchpadHapticClickSettings_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('allowTouchpadHapticClickSettings'); }, + }, - /** - * The click sensitivity values from prefs are [1,3,5] but ChromeVox needs - * to announce them as [1,2,3]. - * @type {!Array<SliderTick>} - * @private - */ - hapticClickSensitivityValues_: { - type: Array, - value() { - return [ - {value: 1, ariaValue: 1}, - {value: 3, ariaValue: 2}, - {value: 5, ariaValue: 3}, - ]; - }, - readOnly: true, - }, - - /** - * TODO(khorimoto): Remove this conditional once the feature is launched. - * @private - */ - allowScrollSettings_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('allowScrollSettings'); - }, - }, - - /** - * TODO(gavinwill): Remove this conditional once the feature is launched. - * @private - */ - allowTouchpadHapticFeedback_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('allowTouchpadHapticFeedback'); - }, - }, - - /** - * TODO(gavinwill): Remove this conditional once the feature is launched. - * @private - */ - allowTouchpadHapticClickSettings_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('allowTouchpadHapticClickSettings'); - }, - }, - - /** - * Used by DeepLinkingBehavior to focus this page's deep links. - * @type {!Set<!chromeos.settings.mojom.Setting>} - */ - supportedSettingIds: { - type: Object, - value: () => new Set([ - chromeos.settings.mojom.Setting.kTouchpadTapToClick, - chromeos.settings.mojom.Setting.kTouchpadTapDragging, - chromeos.settings.mojom.Setting.kTouchpadReverseScrolling, - chromeos.settings.mojom.Setting.kTouchpadAcceleration, - chromeos.settings.mojom.Setting.kTouchpadScrollAcceleration, - chromeos.settings.mojom.Setting.kTouchpadSpeed, - chromeos.settings.mojom.Setting.kTouchpadHapticFeedback, - chromeos.settings.mojom.Setting.kTouchpadHapticClickSensitivity, - chromeos.settings.mojom.Setting.kPointingStickAcceleration, - chromeos.settings.mojom.Setting.kPointingStickSpeed, - chromeos.settings.mojom.Setting.kPointingStickSwapPrimaryButtons, - chromeos.settings.mojom.Setting.kMouseSwapPrimaryButtons, - chromeos.settings.mojom.Setting.kMouseReverseScrolling, - chromeos.settings.mojom.Setting.kMouseAcceleration, - chromeos.settings.mojom.Setting.kMouseScrollAcceleration, - chromeos.settings.mojom.Setting.kMouseSpeed, - ]), - }, - }; - } + /** + * Used by DeepLinkingBehavior to focus this page's deep links. + * @type {!Set<!chromeos.settings.mojom.Setting>} + */ + supportedSettingIds: { + type: Object, + value: () => new Set([ + chromeos.settings.mojom.Setting.kTouchpadTapToClick, + chromeos.settings.mojom.Setting.kTouchpadTapDragging, + chromeos.settings.mojom.Setting.kTouchpadReverseScrolling, + chromeos.settings.mojom.Setting.kTouchpadAcceleration, + chromeos.settings.mojom.Setting.kTouchpadScrollAcceleration, + chromeos.settings.mojom.Setting.kTouchpadSpeed, + chromeos.settings.mojom.Setting.kTouchpadHapticFeedback, + chromeos.settings.mojom.Setting.kTouchpadHapticClickSensitivity, + chromeos.settings.mojom.Setting.kPointingStickAcceleration, + chromeos.settings.mojom.Setting.kPointingStickSpeed, + chromeos.settings.mojom.Setting.kPointingStickSwapPrimaryButtons, + chromeos.settings.mojom.Setting.kMouseSwapPrimaryButtons, + chromeos.settings.mojom.Setting.kMouseReverseScrolling, + chromeos.settings.mojom.Setting.kMouseAcceleration, + chromeos.settings.mojom.Setting.kMouseScrollAcceleration, + chromeos.settings.mojom.Setting.kMouseSpeed, + ]), + }, + }, /** * Headings should only be visible if more than one subsection is present. @@ -195,7 +182,7 @@ // Count the number of true values in sectionVisibilities. const numVisibleSections = sectionVisibilities.filter(x => x).length; return numVisibleSections > 1; - } + }, /** * Mouse, pointing stick, and touchpad sections are only subsections if more @@ -210,11 +197,11 @@ const subsections = this.computeShowHeadings_(hasMouse, hasPointingStick, hasTouchpad); return subsections ? 'subsection' : ''; - } + }, /** * @param {!Route} route - * @param {!Route=} oldRoute + * @param {Route} oldRoute */ currentRouteChanged(route, oldRoute) { // Does not apply to this page. @@ -223,13 +210,13 @@ } this.attemptDeepLink(); - } + }, /** * @param {!Event} event * @private */ - onLearnMoreLinkClicked_(event) { + onLearnMoreLinkClicked_: function(event) { if (!Array.isArray(event.path) || !event.path.length) { return; } @@ -238,28 +225,26 @@ // Do not toggle reverse scrolling if the contained link is clicked. event.stopPropagation(); } - } + }, /** @private */ - onMouseReverseScrollRowClicked_() { + onMouseReverseScrollRowClicked_: function() { this.setPrefValue( 'settings.mouse.reverse_scroll', !this.getPref('settings.mouse.reverse_scroll').value); - } + }, /** @private */ - onTouchpadReverseScrollRowClicked_() { + onTouchpadReverseScrollRowClicked_: function() { this.setPrefValue( 'settings.touchpad.natural_scroll', !this.getPref('settings.touchpad.natural_scroll').value); - } + }, /** @private */ - onTouchpadHapticFeedbackRowClicked_() { + onTouchpadHapticFeedbackRowClicked_: function() { this.setPrefValue( 'settings.touchpad.haptic_feedback', !this.getPref('settings.touchpad.haptic_feedback').value); - } -} - -customElements.define(SettingsPointersElement.is, SettingsPointersElement); + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/power.js b/chrome/browser/resources/settings/chromeos/device_page/power.js index c25bac0..c0ed46a 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/power.js +++ b/chrome/browser/resources/settings/chromeos/device_page/power.js
@@ -14,192 +14,170 @@ import '../../controls/settings_toggle_button.js'; import '../../settings_shared_css.js'; -import {assertNotReached} from '//resources/js/assert.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js'; +import {assert, assertNotReached} from '//resources/js/assert.m.js'; +import {addWebUIListener, removeWebUIListener, sendWithPromise, WebUIListener} from '//resources/js/cr.m.js'; +import {I18nBehavior} from '//resources/js/i18n_behavior.m.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from '//resources/js/web_ui_listener_behavior.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {WebUIListenerBehavior} from '//resources/js/web_ui_listener_behavior.m.js'; +import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {Route} from '../../router.js'; -import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; +import {Route, Router} from '../../router.js'; +import {DeepLinkingBehavior} from '../deep_linking_behavior.js'; import {recordSettingChange} from '../metrics_recorder.js'; import {routes} from '../os_route.js'; -import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js'; +import {RouteObserverBehavior} from '../route_observer_behavior.js'; -import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, IdleBehavior, LidClosedBehavior, PowerManagementSettings, PowerSource} from './device_page_browser_proxy.js'; +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, getDisplayApi, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, StorageSpaceState} from './device_page_browser_proxy.js'; -/** - * @constructor - * @extends {PolymerElement} - * @implements {DeepLinkingBehaviorInterface} - * @implements {I18nBehaviorInterface} - * @implements {RouteObserverBehaviorInterface} - * @implements {WebUIListenerBehaviorInterface} - */ -const SettingsPowerElementBase = mixinBehaviors( - [ - DeepLinkingBehavior, I18nBehavior, RouteObserverBehavior, - WebUIListenerBehavior - ], - PolymerElement); +Polymer({ + _template: html`{__html_template__}`, + is: 'settings-power', -/** @polymer */ -class SettingsPowerElement extends SettingsPowerElementBase { - static get is() { - return 'settings-power'; - } + behaviors: [ + DeepLinkingBehavior, + I18nBehavior, + RouteObserverBehavior, + WebUIListenerBehavior, + ], - static get template() { - return html`{__html_template__}`; - } + properties: { + /** @private {string} ID of the selected power source, or ''. */ + selectedPowerSourceId_: String, - static get properties() { - return { - /** @private {string} ID of the selected power source, or ''. */ - selectedPowerSourceId_: String, + /** @private {!BatteryStatus|undefined} */ + batteryStatus_: Object, - /** @private {!BatteryStatus|undefined} */ - batteryStatus_: Object, + /** @private {boolean} Whether a low-power (USB) charger is being used. */ + lowPowerCharger_: Boolean, - /** @private {boolean} Whether a low-power (USB) charger is being used. */ - lowPowerCharger_: Boolean, + /** @private {boolean} Whether the AC idle behavior is managed by policy. */ + acIdleManaged_: Boolean, - /** - @private {boolean} Whether the AC idle behavior is managed by policy. - */ - acIdleManaged_: Boolean, + /** + * @private {boolean} Whether the battery idle behavior is managed by + * policy. + */ + batteryIdleManaged_: Boolean, - /** - * @private {boolean} Whether the battery idle behavior is managed by - * policy. - */ - batteryIdleManaged_: Boolean, + /** @private {string} Text for label describing the lid-closed behavior. */ + lidClosedLabel_: String, - /** - @private {string} Text for label describing the lid-closed behavior. - */ - lidClosedLabel_: String, + /** @private {boolean} Whether the system possesses a lid. */ + hasLid_: Boolean, - /** @private {boolean} Whether the system possesses a lid. */ - hasLid_: Boolean, + /** + * List of available dual-role power sources. + * @private {!Array<!PowerSource>|undefined} + */ + powerSources_: Array, - /** - * List of available dual-role power sources. - * @private {!Array<!PowerSource>|undefined} - */ - powerSources_: Array, + /** @private */ + powerSourceLabel_: { + type: String, + computed: + 'computePowerSourceLabel_(powerSources_, batteryStatus_.calculating)', + }, - /** @private */ - powerSourceLabel_: { - type: String, - computed: - 'computePowerSourceLabel_(powerSources_, batteryStatus_.calculating)', + /** @private */ + showPowerSourceDropdown_: { + type: Boolean, + computed: 'computeShowPowerSourceDropdown_(powerSources_)', + value: false, + }, + + /** + * The name of the dedicated charging device being used, if present. + * @private {string} + */ + powerSourceName_: { + type: String, + computed: 'computePowerSourceName_(powerSources_, lowPowerCharger_)', + }, + + /** + @private {Array<!{value: IdleBehavior, name: string, selected: + boolean}>} + */ + acIdleOptions_: { + type: Array, + value() { + return []; }, + }, - /** @private */ - showPowerSourceDropdown_: { - type: Boolean, - computed: 'computeShowPowerSourceDropdown_(powerSources_)', - value: false, + /** + @private {Array<!{value: IdleBehavior, name: string, selected: + boolean}>} + */ + batteryIdleOptions_: { + type: Array, + value() { + return []; }, + }, - /** - * The name of the dedicated charging device being used, if present. - * @private {string} - */ - powerSourceName_: { - type: String, - computed: 'computePowerSourceName_(powerSources_, lowPowerCharger_)', + /** @private {boolean} */ + shouldAcIdleSelectBeDisabled_: { + type: Boolean, + computed: 'hasSingleOption_(acIdleOptions_)', + }, + + /** @private {boolean} */ + shouldBatteryIdleSelectBeDisabled_: { + type: Boolean, + computed: 'hasSingleOption_(batteryIdleOptions_)', + }, + + /** @private {boolean} */ + adaptiveChargingEnabled_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('isAdaptiveChargingEnabled'); }, + }, - /** - @private {Array<!{value: IdleBehavior, name: string, selected: - boolean}>} - */ - acIdleOptions_: { - type: Array, - value() { - return []; - }, + /** @private {!chrome.settingsPrivate.PrefObject} */ + lidClosedPref_: { + type: Object, + value() { + return /** @type {!chrome.settingsPrivate.PrefObject} */ ({}); }, + }, - /** - @private {Array<!{value: IdleBehavior, name: string, selected: - boolean}>} - */ - batteryIdleOptions_: { - type: Array, - value() { - return []; - }, + /** @private {!chrome.settingsPrivate.PrefObject} */ + adaptiveChargingPref_: { + type: Object, + value() { + return /** @type {!chrome.settingsPrivate.PrefObject} */ ({}); }, + }, - /** @private {boolean} */ - shouldAcIdleSelectBeDisabled_: { - type: Boolean, - computed: 'hasSingleOption_(acIdleOptions_)', - }, + /** + * Used by DeepLinkingBehavior to focus this page's deep links. + * @type {!Set<!chromeos.settings.mojom.Setting>} + */ + supportedSettingIds: { + type: Object, + value: () => new Set([ + chromeos.settings.mojom.Setting.kPowerIdleBehaviorWhileCharging, + chromeos.settings.mojom.Setting.kPowerSource, + chromeos.settings.mojom.Setting.kSleepWhenLaptopLidClosed, + chromeos.settings.mojom.Setting.kPowerIdleBehaviorWhileOnBattery, + chromeos.settings.mojom.Setting.kAdaptiveCharging, + ]), + }, + }, - /** @private {boolean} */ - shouldBatteryIdleSelectBeDisabled_: { - type: Boolean, - computed: 'hasSingleOption_(batteryIdleOptions_)', - }, - - /** @private {boolean} */ - adaptiveChargingEnabled_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('isAdaptiveChargingEnabled'); - }, - }, - - /** @private {!chrome.settingsPrivate.PrefObject} */ - lidClosedPref_: { - type: Object, - value() { - return /** @type {!chrome.settingsPrivate.PrefObject} */ ({}); - }, - }, - - /** @private {!chrome.settingsPrivate.PrefObject} */ - adaptiveChargingPref_: { - type: Object, - value() { - return /** @type {!chrome.settingsPrivate.PrefObject} */ ({}); - }, - }, - - /** - * Used by DeepLinkingBehavior to focus this page's deep links. - * @type {!Set<!chromeos.settings.mojom.Setting>} - */ - supportedSettingIds: { - type: Object, - value: () => new Set([ - chromeos.settings.mojom.Setting.kPowerIdleBehaviorWhileCharging, - chromeos.settings.mojom.Setting.kPowerSource, - chromeos.settings.mojom.Setting.kSleepWhenLaptopLidClosed, - chromeos.settings.mojom.Setting.kPowerIdleBehaviorWhileOnBattery, - chromeos.settings.mojom.Setting.kAdaptiveCharging, - ]), - }, - - }; - } + /** @private {?DevicePageBrowserProxy} */ + browserProxy_: null, /** @override */ - constructor() { - super(); - - /** @private {?DevicePageBrowserProxy} */ + created() { this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); - } + }, /** @override */ - connectedCallback() { - super.connectedCallback(); - + attached() { this.addWebUIListener( 'battery-status-changed', this.set.bind(this, 'batteryStatus_')); this.addWebUIListener( @@ -210,7 +188,7 @@ 'power-management-settings-changed', this.powerManagementSettingsChanged_.bind(this)); this.browserProxy_.requestPowerManagementSettings(); - } + }, /** * Overridden from DeepLinkingBehavior. @@ -227,11 +205,11 @@ // Continue with deep link attempt. return true; - } + }, /** * @param {!Route} route - * @param {!Route=} oldRoute + * @param {Route} oldRoute */ currentRouteChanged(route, oldRoute) { // Does not apply to this page. @@ -240,7 +218,7 @@ } this.attemptDeepLink(); - } + }, /** * @param {!Array<!PowerSource>|undefined} powerSources @@ -254,7 +232,7 @@ 'calculatingPower' : powerSources && powerSources.length ? 'powerSourceLabel' : 'powerSourceBattery'); - } + }, /** * @param {!Array<!PowerSource>} powerSources @@ -266,7 +244,7 @@ return powerSources.length > 0 && powerSources.every(function(source) { return !source.is_dedicated_charger; }); - } + }, /** * @param {!Array<!PowerSource>} powerSources @@ -282,12 +260,12 @@ return this.i18n('powerSourceAcAdapter'); } return ''; - } + }, /** @private */ onPowerSourceChange_() { this.browserProxy_.setPowerSource(this.$.powerSource.value); - } + }, /** * Used to disable Battery/AC idle select dropdowns. @@ -297,7 +275,7 @@ */ hasSingleOption_(idleOptions) { return idleOptions.length === 1; - } + }, /** * @param {!Event} event @@ -308,16 +286,15 @@ (parseInt(event.target.value, 10)); this.browserProxy_.setIdleBehavior(behavior, true /* whenOnAc */); recordSettingChange(); - } + }, /** @private */ onBatteryIdleSelectChange_() { const behavior = /** @type {IdleBehavior} */ - (parseInt( - this.shadowRoot.querySelector('#batteryIdleSelect').value, 10)); + (parseInt(this.$$('#batteryIdleSelect').value, 10)); this.browserProxy_.setIdleBehavior(behavior, false /* whenOnAc */); recordSettingChange(); - } + }, /** @private */ onLidClosedToggleChange_() { @@ -327,7 +304,7 @@ this.$.lidClosedToggle.checked ? LidClosedBehavior.SUSPEND : LidClosedBehavior.DO_NOTHING); recordSettingChange(); - } + }, /** @private */ onAdaptiveChargingToggleChange_() { @@ -339,7 +316,7 @@ /** @type {!chromeos.settings.mojom.SettingChangeValue} */ ({ boolValue: enabled })); - } + }, /** * @param {!Array<PowerSource>} sources External power sources. @@ -352,7 +329,7 @@ this.powerSources_ = sources; this.selectedPowerSourceId_ = selectedId; this.lowPowerCharger_ = lowPowerCharger; - } + }, /** * @param {LidClosedBehavior} behavior Current behavior. @@ -389,7 +366,7 @@ } this.lidClosedPref_ = pref; - } + }, /** * @param {!IdleBehavior} idleBehavior @@ -434,7 +411,7 @@ default: assertNotReached('Unknown IdleBehavior type'); } - } + }, /** * @param {!Array<!IdleBehavior>} acIdleBehaviors @@ -451,7 +428,7 @@ this.batteryIdleOptions_ = batteryIdleBehaviors.map((idleBehavior) => { return this.getIdleOption_(idleBehavior, currBatteryIdleBehavior); }); - } + }, /** * @param {!PowerManagementSettings} powerManagementSettings Current @@ -476,7 +453,7 @@ type: chrome.settingsPrivate.PrefType.BOOLEAN, value: powerManagementSettings.adaptiveCharging, }; - } + }, /** * Returns the row class for the given settings row @@ -502,7 +479,7 @@ } return c; - } + }, /** * @param {*} lhs @@ -512,7 +489,5 @@ */ isEqual_(lhs, rhs) { return lhs === rhs; - } -} - -customElements.define(SettingsPowerElement.is, SettingsPowerElement); + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage.js b/chrome/browser/resources/settings/chromeos/device_page/storage.js index 8f344d38..348e9d03 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/storage.js +++ b/chrome/browser/resources/settings/chromeos/device_page/storage.js
@@ -11,16 +11,18 @@ import '../../prefs/prefs.js'; import '../../settings_shared_css.js'; +import {assert, assertNotReached} from '//resources/js/assert.m.js'; +import {focusWithoutInk} from '//resources/js/cr/ui/focus_without_ink.m.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from '//resources/js/web_ui_listener_behavior.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {WebUIListenerBehavior} from '//resources/js/web_ui_listener_behavior.m.js'; +import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Route, Router} from '../../router.js'; import {routes} from '../os_route.js'; -import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js'; -import {RouteOriginBehavior, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteObserverBehavior} from '../route_observer_behavior.js'; +import {RouteOriginBehavior, RouteOriginBehaviorImpl} from '../route_origin_behavior.js'; -import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, StorageSpaceState} from './device_page_browser_proxy.js'; +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, getDisplayApi, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, StorageSpaceState} from './device_page_browser_proxy.js'; /** * @typedef {{ @@ -32,85 +34,65 @@ */ let StorageSizeStat; -/** - * @constructor - * @extends {PolymerElement} - * @implements {RouteObserverBehaviorInterface} - * @implements {RouteOriginBehaviorInterface} - * @implements {WebUIListenerBehaviorInterface} - */ -const SettingsStorageElementBase = mixinBehaviors( - [RouteObserverBehavior, RouteOriginBehavior, WebUIListenerBehavior], - PolymerElement); +Polymer({ + _template: html`{__html_template__}`, + is: 'settings-storage', -/** @polymer */ -class SettingsStorageElement extends SettingsStorageElementBase { - static get is() { - return 'settings-storage'; - } + behaviors: [ + RouteObserverBehavior, + RouteOriginBehavior, + WebUIListenerBehavior, + ], - static get template() { - return html`{__html_template__}`; - } + properties: { + androidEnabled: Boolean, - static get properties() { - return { - androidEnabled: Boolean, + /** @private */ + showCrostiniStorage_: { + type: Boolean, + value: false, + }, - /** @private */ - showCrostiniStorage_: { - type: Boolean, - value: false, - }, + /** @private */ + showCrostini: Boolean, - /** @private */ - showCrostini: Boolean, + /** @private */ + isGuest_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('isGuest'); + } + }, - /** @private */ - isGuest_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('isGuest'); - } - }, + /** @private */ + showOtherUsers_: { + type: Boolean, + // Initialize showOtherUsers_ to false if the user is in guest mode. + value() { + return !loadTimeData.getBoolean('isGuest'); + } + }, - /** @private */ - showOtherUsers_: { - type: Boolean, - // Initialize showOtherUsers_ to false if the user is in guest mode. - value() { - return !loadTimeData.getBoolean('isGuest'); - } - }, + /** @private {StorageSizeStat} */ + sizeStat_: Object, + }, - /** @private {StorageSizeStat} */ - sizeStat_: Object, - }; - } + /** RouteOriginBehavior override */ + route_: routes.STORAGE, - static get observers() { - return ['handleCrostiniEnabledChanged_(prefs.crostini.enabled.value)']; - } + observers: ['handleCrostiniEnabledChanged_(prefs.crostini.enabled.value)'], - constructor() { - super(); + /** + * Timer ID for periodic update. + * @private {number} + */ + updateTimerId_: -1, - /** RouteOriginBehavior override */ - this.route_ = routes.STORAGE; - /** - * Timer ID for periodic update. - * @private {number} - */ - this.updateTimerId_ = -1; - - /** @private {?DevicePageBrowserProxy} */ - this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); - } + /** @private {?DevicePageBrowserProxy} */ + browserProxy_: null, /** @override */ - connectedCallback() { - super.connectedCallback(); - + attached() { this.addWebUIListener( 'storage-size-stat-changed', (sizeStat) => this.handleSizeStatChanged_(sizeStat)); @@ -135,32 +117,31 @@ 'storage-system-size-changed', (size) => this.handleSystemSizeChanged_(size)); } - } + }, ready() { - super.ready(); - const r = routes; this.addFocusConfig(r.CROSTINI_DETAILS, '#crostiniSize'); this.addFocusConfig(r.ACCOUNTS, '#otherUsersSize'); this.addFocusConfig( r.EXTERNAL_STORAGE_PREFERENCES, '#externalStoragePreferences'); - } + this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); + }, /** * RouteObserverBehavior * @param {!Route} newRoute - * @param {!Route=} oldRoute + * @param {!Route} oldRoute * @protected */ currentRouteChanged(newRoute, oldRoute) { - super.currentRouteChanged(newRoute, oldRoute); + RouteOriginBehaviorImpl.currentRouteChanged.call(this, newRoute, oldRoute); if (Router.getInstance().getCurrentRoute() !== routes.STORAGE) { return; } this.onPageShown_(); - } + }, /** @private */ onPageShown_() { @@ -169,7 +150,7 @@ this.browserProxy_.updateStorageInfo(); // We update the storage usage periodically when the overlay is visible. this.startPeriodicUpdate_(); - } + }, /** * Handler for tapping the "My files" item. @@ -177,7 +158,7 @@ */ onMyFilesTap_() { this.browserProxy_.openMyFiles(); - } + }, /** * Handler for tapping the "Browsing data" item. @@ -185,7 +166,7 @@ */ onBrowsingDataTap_() { window.open('chrome://settings/clearBrowserData'); - } + }, /** * Handler for tapping the "Apps and Extensions" item. @@ -193,7 +174,7 @@ */ onAppsTap_() { window.location = 'chrome://os-settings/app-management'; - } + }, /** * Handler for tapping the "Linux storage" item. @@ -203,7 +184,7 @@ Router.getInstance().navigateTo( routes.CROSTINI_DETAILS, /* dynamicParams */ null, /* removeSearch */ true); - } + }, /** * Handler for tapping the "Other users" item. @@ -213,7 +194,7 @@ Router.getInstance().navigateTo( routes.ACCOUNTS, /* dynamicParams */ null, /* removeSearch */ true); - } + }, /** * Handler for tapping the "External storage preferences" item. @@ -221,7 +202,7 @@ */ onExternalStoragePreferencesTap_() { Router.getInstance().navigateTo(routes.EXTERNAL_STORAGE_PREFERENCES); - } + }, /** * @param {!StorageSizeStat} sizeStat @@ -232,7 +213,7 @@ this.$.inUseLabelArea.style.width = (sizeStat.usedRatio * 100) + '%'; this.$.availableLabelArea.style.width = ((1 - sizeStat.usedRatio) * 100) + '%'; - } + }, /** * @param {string} size Formatted string representing the size of My files. @@ -240,7 +221,7 @@ */ handleMyFilesSizeChanged_(size) { this.$.myFilesSize.subLabel = size; - } + }, /** * @param {string} size Formatted string representing the size of Browsing @@ -249,7 +230,7 @@ */ handleBrowsingDataSizeChanged_(size) { this.$.browsingDataSize.subLabel = size; - } + }, /** * @param {string} size Formatted string representing the size of Apps and @@ -257,8 +238,8 @@ * @private */ handleAppsSizeChanged_(size) { - this.shadowRoot.querySelector('#appsSize').subLabel = size; - } + this.$$('#appsSize').subLabel = size; + }, /** * @param {string} size Formatted string representing the size of Crostini @@ -267,9 +248,9 @@ */ handleCrostiniSizeChanged_(size) { if (this.showCrostiniStorage_) { - this.shadowRoot.querySelector('#crostiniSize').subLabel = size; + this.$$('#crostiniSize').subLabel = size; } - } + }, /** * @param {string} size Formatted string representing the size of Other @@ -284,16 +265,16 @@ return; } this.showOtherUsers_ = true; - this.shadowRoot.querySelector('#otherUsersSize').subLabel = size; - } + this.$$('#otherUsersSize').subLabel = size; + }, /** * @param {string} size Formatted string representing the System size. * @private */ handleSystemSizeChanged_(size) { - this.shadowRoot.querySelector('#systemSizeSubLabel').innerText = size; - } + this.$$('#systemSizeSubLabel').innerText = size; + }, /** * @param {boolean} enabled True if Crostini is enabled. @@ -301,7 +282,7 @@ */ handleCrostiniEnabledChanged_(enabled) { this.showCrostiniStorage_ = enabled && this.showCrostini; - } + }, /** * Starts periodic update for storage usage. @@ -318,7 +299,7 @@ this.browserProxy_.updateStorageInfo(); }, 5000); } - } + }, /** * Stops periodic update for storage usage. @@ -329,7 +310,7 @@ window.clearInterval(this.updateTimerId_); this.updateTimerId_ = -1; } - } + }, /** * Returns true if the remaining space is low, but not critically low. @@ -339,7 +320,7 @@ */ isSpaceLow_(spaceState) { return spaceState === StorageSpaceState.LOW; - } + }, /** * Returns true if the remaining space is critically low. @@ -349,7 +330,7 @@ */ isSpaceCriticallyLow_(spaceState) { return spaceState === StorageSpaceState.CRITICALLY_LOW; - } + }, /** * Computes class name of the bar based on the remaining space size. @@ -366,7 +347,5 @@ default: return ''; } - } -} - -customElements.define(SettingsStorageElement.is, SettingsStorageElement); + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage_external.js b/chrome/browser/resources/settings/chromeos/device_page/storage_external.js index d65b463..0fe7ab5c0 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/storage_external.js +++ b/chrome/browser/resources/settings/chromeos/device_page/storage_external.js
@@ -13,71 +13,57 @@ import '../../prefs/prefs.js'; import '../../settings_shared_css.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from '//resources/js/web_ui_listener_behavior.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {assert, assertNotReached} from '//resources/js/assert.m.js'; +import {I18nBehavior} from '//resources/js/i18n_behavior.m.js'; +import {WebUIListenerBehavior} from '//resources/js/web_ui_listener_behavior.m.js'; +import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage} from './device_page_browser_proxy.js'; +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, getDisplayApi, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, StorageSpaceState} from './device_page_browser_proxy.js'; -/** - * @constructor - * @extends {PolymerElement} - * @implements {I18nBehaviorInterface} - * @implements {WebUIListenerBehaviorInterface} - */ -const SettingsStorageExternalElementBase = - mixinBehaviors([I18nBehavior, WebUIListenerBehavior], PolymerElement); +Polymer({ + _template: html`{__html_template__}`, + is: 'settings-storage-external', -/** @polymer */ -class SettingsStorageExternalElement extends - SettingsStorageExternalElementBase { - static get is() { - return 'settings-storage-external'; - } + behaviors: [ + I18nBehavior, + WebUIListenerBehavior, + ], - static get template() { - return html`{__html_template__}`; - } + properties: { + /** + * List of the plugged-in external storages. + * @private {Array<!ExternalStorage>} + */ + externalStorages_: { + type: Array, + value() { + return []; + } + }, - static get properties() { - return { - /** - * List of the plugged-in external storages. - * @private {Array<!ExternalStorage>} - */ - externalStorages_: { - type: Array, - value() { - return []; - } + /** @private {!chrome.settingsPrivate.PrefObject} */ + externalStorageVisiblePref_: { + type: Object, + value() { + return /** @type {!chrome.settingsPrivate.PrefObject} */ ({}); }, + }, + }, - /** @private {!chrome.settingsPrivate.PrefObject} */ - externalStorageVisiblePref_: { - type: Object, - value() { - return /** @type {!chrome.settingsPrivate.PrefObject} */ ({}); - }, - }, - }; - } + /** @private {?DevicePageBrowserProxy} */ + browserProxy_: null, /** @override */ - constructor() { - super(); - - /** @private {?DevicePageBrowserProxy} */ + created() { this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); - } + }, /** @override */ - connectedCallback() { - super.connectedCallback(); - + attached() { this.browserProxy_.setExternalStoragesUpdatedCallback( this.handleExternalStoragesUpdated_.bind(this)); this.browserProxy_.updateExternalStorages(); - } + }, /** * @param {Array<!ExternalStorage>} storages @@ -85,7 +71,7 @@ */ handleExternalStoragesUpdated_(storages) { this.externalStorages_ = storages; - } + }, /** * @param {Array<!ExternalStorage>} externalStorages @@ -97,8 +83,5 @@ !externalStorages || externalStorages.length === 0 ? 'storageExternalStorageEmptyListHeader' : 'storageExternalStorageListHeader'); - } -} - -customElements.define( - SettingsStorageExternalElement.is, SettingsStorageExternalElement); + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js b/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js index d6cf683e..307cbea 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js +++ b/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js
@@ -11,58 +11,41 @@ import '../../prefs/prefs.js'; import '../../settings_shared_css.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from '//resources/js/web_ui_listener_behavior.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {assert, assertNotReached} from '//resources/js/assert.m.js'; +import {WebUIListenerBehavior} from '//resources/js/web_ui_listener_behavior.m.js'; +import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js'; +import {PrefsBehavior} from '../prefs_behavior.js'; -/** - * @constructor - * @extends {PolymerElement} - * @implements {WebUIListenerBehaviorInterface} - * @implements {PrefsBehaviorInterface} - */ -const StorageExternalEntryElementBase = - mixinBehaviors([WebUIListenerBehavior, PrefsBehavior], PolymerElement); +Polymer({ + _template: html`{__html_template__}`, + is: 'storage-external-entry', -/** @polymer */ -class StorageExternalEntryElement extends StorageExternalEntryElementBase { - static get is() { - return 'storage-external-entry'; - } + behaviors: [WebUIListenerBehavior, PrefsBehavior], - static get template() { - return html`{__html_template__}`; - } + properties: { + /** + * FileSystem UUID of an external storage. + */ + uuid: String, - static get properties() { - return { - /** - * FileSystem UUID of an external storage. - */ - uuid: String, + /** + * Label of an external storage. + */ + label: String, - /** - * Label of an external storage. - */ - label: String, - - /** @private {chrome.settingsPrivate.PrefObject} */ - visiblePref_: { - type: Object, - value() { - return /** @type {chrome.settingsPrivate.PrefObject} */ ({}); - }, + /** @private {chrome.settingsPrivate.PrefObject} */ + visiblePref_: { + type: Object, + value() { + return /** @type {chrome.settingsPrivate.PrefObject} */ ({}); }, + }, + }, - }; - } - - static get observers() { - return [ - 'updateVisible_(prefs.arc.visible_external_storages.*)', - ]; - } + observers: [ + 'updateVisible_(prefs.arc.visible_external_storages.*)', + ], /** * Handler for when the toggle button for this entry is clicked by a user. @@ -78,7 +61,7 @@ } chrome.metricsPrivate.recordBoolean( 'Arc.ExternalStorage.SetVisible', visible); - } + }, /** * Updates |visiblePref_| by reading the preference and check if it contains @@ -95,8 +78,5 @@ value: visible, }; this.visiblePref_ = pref; - } -} - -customElements.define( - StorageExternalEntryElement.is, StorageExternalEntryElement); + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/device_page/stylus.js b/chrome/browser/resources/settings/chromeos/device_page/stylus.js index 691eb75..a3a077c 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/stylus.js +++ b/chrome/browser/resources/settings/chromeos/device_page/stylus.js
@@ -7,147 +7,116 @@ * 'settings-stylus' is the settings subpage with stylus-specific settings. */ +const FIND_MORE_APPS_URL = 'https://play.google.com/store/apps/' + + 'collection/promotion_30023cb_stylus_apps'; + +import {afterNextRender, Polymer, html, flush, Templatizer, TemplateInstanceBase} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {assert, assertNotReached} from '//resources/js/assert.m.js'; import '//resources/cr_elements/cr_link_row/cr_link_row.js'; import '//resources/cr_elements/cr_toggle/cr_toggle.m.js'; import '//resources/cr_elements/shared_vars_css.m.js'; import '//resources/js/action_link.js'; import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; +import {CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_indicator_behavior.m.js'; +import {I18nBehavior} from '//resources/js/i18n_behavior.m.js'; +import {loadTimeData} from '//resources/js/load_time_data.m.js'; +import {BatteryStatus, DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage, IdleBehavior, LidClosedBehavior, NoteAppInfo, NoteAppLockScreenSupport, PowerManagementSettings, PowerSource, getDisplayApi, StorageSpaceState} from './device_page_browser_proxy.js'; import '../../controls/settings_toggle_button.js'; import '../../settings_shared_css.js'; - -import {CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_indicator_behavior.m.js'; -import {assert} from '//resources/js/assert.m.js'; -import {loadTimeData} from '//resources/js/load_time_data.m.js'; -import {html, microTask, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {Route} from '../../router.js'; -import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; -import {recordSettingChange} from '../metrics_recorder.js'; +import {Router, Route} from '../../router.js'; +import {RouteObserverBehavior} from '../route_observer_behavior.js'; import {routes} from '../os_route.js'; -import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js'; +import {recordSettingChange} from '../metrics_recorder.js'; +import {DeepLinkingBehavior} from '../deep_linking_behavior.js'; -import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, NoteAppInfo, NoteAppLockScreenSupport} from './device_page_browser_proxy.js'; +Polymer({ + _template: html`{__html_template__}`, + is: 'settings-stylus', -const FIND_MORE_APPS_URL = 'https://play.google.com/store/apps/' + - 'collection/promotion_30023cb_stylus_apps'; + behaviors: [ + DeepLinkingBehavior, + RouteObserverBehavior, + ], -/** - * @constructor - * @extends {PolymerElement} - * @implements {DeepLinkingBehaviorInterface} - * @implements {RouteObserverBehaviorInterface} - */ -const SettingsStylusElementBase = mixinBehaviors( - [DeepLinkingBehavior, RouteObserverBehavior], PolymerElement); + properties: { + /** Preferences state. */ + prefs: { + type: Object, + notify: true, + }, -/** @polymer */ -class SettingsStylusElement extends SettingsStylusElementBase { - static get is() { - return 'settings-stylus'; - } + /** + * Policy indicator type for user policy - used for policy indicator UI + * shown when an app that is not allowed to run on lock screen by policy is + * selected. + * @type {CrPolicyIndicatorType} + * @private + */ + userPolicyIndicator_: { + type: String, + value: CrPolicyIndicatorType.USER_POLICY, + }, - static get template() { - return html`{__html_template__}`; - } + /** + * Note taking apps the user can pick between. + * @private {Array<!NoteAppInfo>} + */ + appChoices_: { + type: Array, + value() { + return []; + } + }, - static get properties() { - return { - /** Preferences state. */ - prefs: { - type: Object, - notify: true, + /** + * True if the device has an internal stylus. + * @private + */ + hasInternalStylus_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('hasInternalStylus'); }, + readOnly: true, + }, - /** - * Policy indicator type for user policy - used for policy indicator UI - * shown when an app that is not allowed to run on lock screen by policy - * is selected. - * @type {CrPolicyIndicatorType} - * @private - */ - userPolicyIndicator_: { - type: String, - value: CrPolicyIndicatorType.USER_POLICY, - }, + /** + * Currently selected note taking app. + * @private {?NoteAppInfo} + */ + selectedApp_: { + type: Object, + value: null, + }, - /** - * Note taking apps the user can pick between. - * @private {Array<!NoteAppInfo>} - */ - appChoices_: { - type: Array, - value() { - return []; - } - }, + /** + * True if the ARC container has not finished starting yet. + * @private + */ + waitingForAndroid_: { + type: Boolean, + value: false, + }, - /** - * True if the device has an internal stylus. - * @private - */ - hasInternalStylus_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('hasInternalStylus'); - }, - readOnly: true, - }, - - /** - * Currently selected note taking app. - * @private {?NoteAppInfo} - */ - selectedApp_: { - type: Object, - value: null, - }, - - /** - * True if the ARC container has not finished starting yet. - * @private - */ - waitingForAndroid_: { - type: Boolean, - value: false, - }, - - /** - * Used by DeepLinkingBehavior to focus this page's deep links. - * @type {!Set<!chromeos.settings.mojom.Setting>} - */ - supportedSettingIds: { - type: Object, - value: () => new Set([ - chromeos.settings.mojom.Setting.kStylusToolsInShelf, - chromeos.settings.mojom.Setting.kStylusNoteTakingApp, - chromeos.settings.mojom.Setting.kStylusNoteTakingFromLockScreen, - chromeos.settings.mojom.Setting.kStylusLatestNoteOnLockScreen, - ]), - }, - - }; - } - - /** @override */ - constructor() { - super(); - - /** @private {?DevicePageBrowserProxy} */ - this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); - } - - /** @override */ - ready() { - super.ready(); - - this.browserProxy_.setNoteTakingAppsUpdatedCallback( - this.onNoteAppsUpdated_.bind(this)); - this.browserProxy_.requestNoteTakingApps(); - } + /** + * Used by DeepLinkingBehavior to focus this page's deep links. + * @type {!Set<!chromeos.settings.mojom.Setting>} + */ + supportedSettingIds: { + type: Object, + value: () => new Set([ + chromeos.settings.mojom.Setting.kStylusToolsInShelf, + chromeos.settings.mojom.Setting.kStylusNoteTakingApp, + chromeos.settings.mojom.Setting.kStylusNoteTakingFromLockScreen, + chromeos.settings.mojom.Setting.kStylusLatestNoteOnLockScreen, + ]), + }, + }, /** * @param {!Route} route - * @param {!Route=} oldRoute + * @param {Route} oldRoute */ currentRouteChanged(route, oldRoute) { // Does not apply to this page. @@ -156,7 +125,7 @@ } this.attemptDeepLink(); - } + }, /** * @return {boolean} Whether note taking from the lock screen is supported @@ -167,7 +136,7 @@ return !!this.selectedApp_ && this.selectedApp_.lockScreenSupport !== NoteAppLockScreenSupport.NOT_SUPPORTED; - } + }, /** * @return {boolean} Whether the selected app is disallowed to handle note @@ -178,7 +147,7 @@ return !!this.selectedApp_ && this.selectedApp_.lockScreenSupport === NoteAppLockScreenSupport.NOT_ALLOWED_BY_POLICY; - } + }, /** * @return {boolean} Whether the selected app is enabled as a note action @@ -189,7 +158,22 @@ return !!this.selectedApp_ && this.selectedApp_.lockScreenSupport === NoteAppLockScreenSupport.ENABLED; - } + }, + + /** @private {?DevicePageBrowserProxy} */ + browserProxy_: null, + + /** @override */ + created() { + this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance(); + }, + + /** @override */ + ready() { + this.browserProxy_.setNoteTakingAppsUpdatedCallback( + this.onNoteAppsUpdated_.bind(this)); + this.browserProxy_.requestNoteTakingApps(); + }, /** * Finds note app info with the provided app id. @@ -202,7 +186,7 @@ return app.value === id; }) || null; - } + }, /** * Toggles whether the selected app is enabled as a note action handler on @@ -222,7 +206,7 @@ this.selectedApp_.lockScreenSupport === NoteAppLockScreenSupport.SUPPORTED); recordSettingChange(); - } + }, /** @private */ onSelectedAppChanged_() { @@ -233,7 +217,7 @@ this.browserProxy_.setPreferredNoteTakingApp(app.value); recordSettingChange(); } - } + }, /** * @param {Array<!NoteAppInfo>} apps @@ -245,8 +229,8 @@ this.appChoices_ = apps; // Wait until app selection UI is updated before setting the selected app. - microTask.run(this.onSelectedAppChanged_.bind(this)); - } + this.async(this.onSelectedAppChanged_.bind(this)); + }, /** * @param {Array<!NoteAppInfo>} apps @@ -255,7 +239,7 @@ */ showNoApps_(apps, waitingForAndroid) { return apps.length === 0 && !waitingForAndroid; - } + }, /** * @param {Array<!NoteAppInfo>} apps @@ -264,12 +248,10 @@ */ showApps_(apps, waitingForAndroid) { return apps.length > 0 && !waitingForAndroid; - } + }, /** @private */ onFindAppsTap_() { this.browserProxy_.showPlayStore(FIND_MORE_APPS_URL); - } -} - -customElements.define(SettingsStylusElement.is, SettingsStylusElement); + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js index d37a60b9..1cce27e 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
@@ -397,7 +397,8 @@ */ onRemoveAccountTap_() { this.$$('cr-action-menu').close(); - if (loadTimeData.getBoolean('lacrosEnabled')) { + if (loadTimeData.getBoolean('lacrosEnabled') && + this.actionMenuAccount_.isManaged) { this.$.removeConfirmationDialog.showModal(); } else { this.browserProxy_.removeAccount(
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_browser_proxy.js b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_browser_proxy.js index eaa858d..30fffba 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_browser_proxy.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_browser_proxy.js
@@ -14,6 +14,7 @@ * isDeviceAccount: boolean, * isSignedIn: boolean, * unmigrated: boolean, + * isManaged: boolean, * fullName: string, * email: string, * pic: string,
diff --git a/chrome/browser/signin/signin_ui_delegate_impl_lacros.cc b/chrome/browser/signin/signin_ui_delegate_impl_lacros.cc index eecd930..b1c703e 100644 --- a/chrome/browser/signin/signin_ui_delegate_impl_lacros.cc +++ b/chrome/browser/signin/signin_ui_delegate_impl_lacros.cc
@@ -36,6 +36,7 @@ case signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE: case signin_metrics::AccessPoint::ACCESS_POINT_PASSWORD_BUBBLE: case signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE: + case signin_metrics::AccessPoint::ACCESS_POINT_RECENT_TABS: return account_manager::AccountManagerFacade::AccountAdditionSource:: kChromeSyncPromoAddAccount; default: @@ -62,6 +63,7 @@ case signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE: case signin_metrics::AccessPoint::ACCESS_POINT_PASSWORD_BUBBLE: case signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE: + case signin_metrics::AccessPoint::ACCESS_POINT_RECENT_TABS: return account_manager::AccountManagerFacade::AccountAdditionSource:: kChromeSyncPromoReauth; default:
diff --git a/chrome/browser/signin/signin_ui_delegate_impl_lacros.h b/chrome/browser/signin/signin_ui_delegate_impl_lacros.h index 953ab34..9ee3527 100644 --- a/chrome/browser/signin/signin_ui_delegate_impl_lacros.h +++ b/chrome/browser/signin/signin_ui_delegate_impl_lacros.h
@@ -13,11 +13,15 @@ class SigninUiDelegateImplLacros : public SigninUiDelegate { public: // SigninUiDelegate: + // Displays the Chrome account picker first, if the system has available + // accounts. If the user chooses to add a new account or no existing accounts + // are available, this function will display OS's add account flow. void ShowSigninUI(Browser* browser, Profile* profile, bool enable_sync, signin_metrics::AccessPoint access_point, signin_metrics::PromoAction promo_action) override; + // Displays OS's reauth dialog. void ShowReauthUI(Browser* browser, Profile* profile, const std::string& email,
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc index a291cca..4be78a9 100644 --- a/chrome/browser/signin/signin_ui_util.cc +++ b/chrome/browser/signin/signin_ui_util.cc
@@ -218,18 +218,6 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) } -#if BUILDFLAG(IS_CHROMEOS_LACROS) -void ShowSigninPromptAndMaybeEnableSync( - Browser* browser, - Profile* profile, - bool enable_sync, - signin_metrics::AccessPoint access_point, - signin_metrics::PromoAction promo_action) { - GetSigninUiDelegate()->ShowSigninUI(browser, profile, enable_sync, - access_point, promo_action); -} -#endif // BUILDFLAG(IS_CHROMEOS_LACROS) - void ShowExtensionSigninPrompt(Profile* profile, bool enable_sync, const std::string& email_hint) {
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h index f353335..7cbea009 100644 --- a/chrome/browser/signin/signin_ui_util.h +++ b/chrome/browser/signin/signin_ui_util.h
@@ -54,22 +54,6 @@ bool enable_sync, const std::string& email_hint); -#if BUILDFLAG(IS_CHROMEOS_LACROS) -// Displays sign-in UI to the user and shows the Sync confirmation if the user -// successfully adds an account and `enable_sync` is true. -// This will display the Chrome account picker first, if the system has -// available accounts. If the user chooses to add a new account or no existing -// accounts are available, this function will display OS's add account flow. -// `browser` might be null. In that case, this function will try to re-use an -// existing or open a new browser window for a `profile` if needed. -void ShowSigninPromptAndMaybeEnableSync( - Browser* browser, - Profile* profile, - bool enable_sync, - signin_metrics::AccessPoint access_point, - signin_metrics::PromoAction promo_action); -#endif // BUILDFLAG(IS_CHROMEOS_LACROS) - // This function is used to enable sync for a given account: // * This function does nothing if the user is already signed in to Chrome. // * If |account| is empty, then it presents the Chrome sign-in page.
diff --git a/chrome/browser/signin/signin_ui_util_unittest.cc b/chrome/browser/signin/signin_ui_util_unittest.cc index 2a9d03e..60e799e2 100644 --- a/chrome/browser/signin/signin_ui_util_unittest.cc +++ b/chrome/browser/signin/signin_ui_util_unittest.cc
@@ -807,18 +807,6 @@ ShowExtensionSigninPrompt(profile(), /*enable_sync=*/true, kMainEmail); } -TEST_F(MirrorSigninUiUtilTest, ShowSigninPromptAndMaybeEnableSync) { - auto access_point = - signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN; - auto promo_action = signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO; - - for (bool enable_sync : {true, false}) { - ExpectAddAccount(enable_sync, access_point, promo_action); - ShowSigninPromptAndMaybeEnableSync(browser(), profile(), enable_sync, - access_point, promo_action); - } -} - #endif // BUILDFLAG(IS_CHROMEOS_LACROS) // This test does not use the SigninUiUtilTest test fixture, because it
diff --git a/chrome/browser/subresource_filter/ad_tagging_browsertest.cc b/chrome/browser/subresource_filter/ad_tagging_browsertest.cc index 1adf76c..cf55036 100644 --- a/chrome/browser/subresource_filter/ad_tagging_browsertest.cc +++ b/chrome/browser/subresource_filter/ad_tagging_browsertest.cc
@@ -395,7 +395,6 @@ const char kSubresourceFilterOriginStatusHistogram[] = "PageLoad.Clients.Ads.FrameCounts.AdFrames.PerFrame." "OriginStatus"; -const char kWindowOpenFromAdStateHistogram[] = "Blink.WindowOpen.FromAdState"; IN_PROC_BROWSER_TEST_F(AdTaggingBrowserTest, VerifySameOriginWithoutNavigate) { // The test assumes pages gets deleted after navigation, triggering histogram @@ -939,16 +938,6 @@ from_ad_script); } -void ExpectWindowOpenUmaEntry(const base::HistogramTester& histogram_tester, - bool from_ad_subframe, - bool from_ad_script) { - metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); - blink::FromAdState state = - blink::GetFromAdState(from_ad_subframe, from_ad_script); - histogram_tester.ExpectBucketCount(kWindowOpenFromAdStateHistogram, state, - 1 /* expected_count */); -} - enum class NavigationInitiationType { kWindowOpen, kSetLocation, @@ -1070,7 +1059,6 @@ bool from_ad_script = from_ad_subframe; ExpectWindowOpenUkmEntry(ukm_recorder, false /* from_main_frame */, main_frame_url, from_ad_subframe, from_ad_script); - ExpectWindowOpenUmaEntry(histogram_tester, from_ad_subframe, from_ad_script); } INSTANTIATE_TEST_SUITE_P( @@ -1102,7 +1090,6 @@ bool from_ad_subframe = false; ExpectWindowOpenUkmEntry(ukm_recorder, true /* from_main_frame */, main_frame_url, from_ad_subframe, from_ad_script); - ExpectWindowOpenUmaEntry(histogram_tester, from_ad_subframe, from_ad_script); } INSTANTIATE_TEST_SUITE_P(
diff --git a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc index 93e7181..27aad2a 100644 --- a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/sync/test/integration/bookmarks_helper.h" #include "chrome/browser/sync/test/integration/encryption_helper.h" #include "chrome/browser/sync/test/integration/passwords_helper.h" +#include "chrome/browser/sync/test/integration/sync_engine_stopped_checker.h" #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "components/password_manager/core/browser/password_form.h" @@ -47,6 +48,7 @@ using syncer::Pbkdf2PassphraseKeyParamsForTesting; using syncer::ProtoPassphraseInt32ToEnum; using syncer::ScryptPassphraseKeyParamsForTesting; +using syncer::SyncEngineStoppedChecker; using syncer::SyncService; using testing::ElementsAre; using testing::SizeIs; @@ -84,18 +86,6 @@ std::set<std::string> committed_names_; }; -class SyncEngineStoppedChecker : public SingleClientStatusChangeChecker { - public: - explicit SyncEngineStoppedChecker(syncer::SyncServiceImpl* service) - : SingleClientStatusChangeChecker(service) {} - - // StatusChangeChecker implementation. - bool IsExitConditionSatisfied(std::ostream* os) override { - *os << "Waiting for sync to stop"; - return !service()->IsEngineInitialized(); - } -}; - // These tests use a gray-box testing approach to verify that the data committed // to the server is encrypted properly, and that properly-encrypted data from // the server is successfully decrypted by the client. They also verify that the
diff --git a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc index 6bf7979..67f9499 100644 --- a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
@@ -1455,10 +1455,6 @@ GetSecurityDomainsServer()->ResetData(); GetFakeServer()->ClearServerData(); - // Make change to trigger sync cycle. - bookmarks_helper::AddURL(/*profile=*/0, /*title=*/"title", - GURL("http://www.google.com")); - // Wait until sync gets disabled to ensure client is aware of reset. ASSERT_TRUE(SyncDisabledChecker(GetSyncService(0)).Wait());
diff --git a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc index e37a257..c42189d 100644 --- a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
@@ -176,14 +176,9 @@ ASSERT_TRUE(GetSyncService(0)->IsSyncFeatureActive()); // Trigger a "Reset Sync" from the dashboard and wait for it to apply. This - // involves clearing the server data so that the birthday gets incremented, - // and also sending an appropriate error. + // involves clearing the server data so that the birthday gets incremented. GetFakeServer()->ClearServerData(); - GetFakeServer()->TriggerActionableError( - sync_pb::SyncEnums::NOT_MY_BIRTHDAY, "Reset Sync from Dashboard", - "https://chrome.google.com/sync", sync_pb::SyncEnums::UNKNOWN_ACTION); EXPECT_TRUE(SyncDisabledByUserChecker(GetSyncService(0)).Wait()); - GetFakeServer()->ClearActionableError(); // On all platforms, Sync-the-feature should now be disabled. EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
diff --git a/chrome/browser/sync/test/integration/single_client_wifi_configuration_sync_test.cc b/chrome/browser/sync/test/integration/single_client_wifi_configuration_sync_test.cc new file mode 100644 index 0000000..2a53ec6 --- /dev/null +++ b/chrome/browser/sync/test/integration/single_client_wifi_configuration_sync_test.cc
@@ -0,0 +1,228 @@ +// 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 <memory> +#include <string> +#include <vector> + +#include "ash/public/cpp/network_config_service.h" +#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" +#include "chrome/browser/sync/test/integration/status_change_checker.h" +#include "chrome/browser/sync/test/integration/sync_engine_stopped_checker.h" +#include "chrome/browser/sync/test/integration/sync_service_impl_harness.h" +#include "chrome/browser/sync/test/integration/sync_test.h" +#include "chromeos/components/sync_wifi/network_identifier.h" +#include "chromeos/components/sync_wifi/test_data_generator.h" +#include "chromeos/dbus/shill/shill_profile_client.h" +#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" +#include "components/sync/engine/loopback_server/persistent_unique_client_entity.h" +#include "components/sync/nigori/cryptographer_impl.h" +#include "components/sync/nigori/nigori_test_utils.h" +#include "components/sync/protocol/wifi_configuration_specifics.pb.h" +#include "components/sync/test/fake_server/fake_server.h" +#include "content/public/test/browser_test.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace { + +std::string GetClientTag(const sync_pb::WifiConfigurationSpecifics& specifics) { + return chromeos::sync_wifi::NetworkIdentifier::FromProto(specifics) + .SerializeToString(); +} + +void InjectKeystoreEncryptedServerWifiConfiguration( + fake_server::FakeServer* fake_server, + const sync_pb::WifiConfigurationSpecifics& unencrypted_specifics) { + sync_pb::EntitySpecifics wrapped_unencrypted_specifics; + *wrapped_unencrypted_specifics.mutable_wifi_configuration() = + unencrypted_specifics; + + sync_pb::EntitySpecifics encrypted_specifics; + const syncer::KeyParamsForTesting keystore_key_params = + syncer::KeystoreKeyParamsForTesting( + fake_server->GetKeystoreKeys().back()); + auto cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting( + keystore_key_params.password, keystore_key_params.derivation_params); + bool encrypt_result = cryptographer->Encrypt( + wrapped_unencrypted_specifics, encrypted_specifics.mutable_encrypted()); + *encrypted_specifics.mutable_wifi_configuration() = + sync_pb::WifiConfigurationSpecifics(); + DCHECK(encrypt_result); + + fake_server->InjectEntity( + syncer::PersistentUniqueClientEntity::CreateFromSpecificsForTesting( + /*non_unique_name=*/"encrypted", GetClientTag(unencrypted_specifics), + encrypted_specifics, + /*creation_time=*/0, /*last_modified_time=*/0)); +} + +// Observes Shill networks state via IPC. Used to wait until wifi configuration +// becomes locally available. +class LocalWifiConfigurationChecker + : public StatusChangeChecker, + public chromeos::network_config::mojom::CrosNetworkConfigObserver { + public: + LocalWifiConfigurationChecker( + mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>* + remote_cros_network_config, + const std::string& expected_ssid) + : expected_ssid_(expected_ssid), + remote_cros_network_config_(remote_cros_network_config) { + DCHECK(remote_cros_network_config_); + (*remote_cros_network_config_) + ->AddObserver(receiver_.BindNewPipeAndPassRemote()); + OnNetworkStateListChanged(); + } + + LocalWifiConfigurationChecker(const LocalWifiConfigurationChecker& other) = + delete; + LocalWifiConfigurationChecker& operator=( + const LocalWifiConfigurationChecker& other) = delete; + ~LocalWifiConfigurationChecker() override = default; + + // CrosNetworkConfigObserver implementation. + void OnNetworkStateListChanged() override { + (*remote_cros_network_config_) + ->GetNetworkStateList( + chromeos::network_config::mojom::NetworkFilter::New( + chromeos::network_config::mojom::FilterType::kConfigured, + chromeos::network_config::mojom::NetworkType::kWiFi, + /*limit=*/0), + base::BindOnce(&LocalWifiConfigurationChecker::OnGetNetworkList, + weak_ptr_factory_.GetWeakPtr())); + } + + void OnActiveNetworksChanged( + std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr> + networks) override {} + void OnNetworkStateChanged( + chromeos::network_config::mojom::NetworkStatePropertiesPtr network) + override {} + void OnDeviceStateListChanged() override {} + void OnVpnProvidersChanged() override {} + void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} + + // StatusChangeChecker implementation. + bool IsExitConditionSatisfied(std::ostream* os) override { + *os << "Waiting for network with ssid: " << expected_ssid_; + for (const auto& network : networks_) { + if (network->type_state->get_wifi()->ssid == expected_ssid_) { + return true; + } + } + return false; + } + + void OnGetNetworkList( + std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr> + networks) { + networks_ = std::move(networks); + CheckExitCondition(); + } + + private: + const std::string expected_ssid_; + std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr> + networks_; + + mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>* + remote_cros_network_config_; + mojo::Receiver<chromeos::network_config::mojom::CrosNetworkConfigObserver> + receiver_{this}; + base::WeakPtrFactory<LocalWifiConfigurationChecker> weak_ptr_factory_{this}; +}; + +// TODO(crbug.com/1077152): add more tests. +class SingleClientWifiConfigurationSyncTest : public SyncTest { + public: + SingleClientWifiConfigurationSyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientWifiConfigurationSyncTest( + const SingleClientWifiConfigurationSyncTest&) = delete; + SingleClientWifiConfigurationSyncTest& operator=( + const SingleClientWifiConfigurationSyncTest&) = delete; + ~SingleClientWifiConfigurationSyncTest() override = default; + + void SetUpOnMainThread() override { + ash::GetNetworkConfigService( + remote_cros_network_config_.BindNewPipeAndPassReceiver()); + + SyncTest::SetUpOnMainThread(); + } + + void SetupShill() { + // TODO(crbug.com/1077152): figure out where |userhash| is hardcoded and use + // some shared constant here. + chromeos::ShillProfileClient::Get()->GetTestInterface()->AddProfile( + GetProfile(0)->GetPath().value(), /*userhash=*/"test-user"); + } + + mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>* + remote_cros_network_config() { + return &remote_cros_network_config_; + } + + private: + mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig> + remote_cros_network_config_; +}; + +IN_PROC_BROWSER_TEST_F(SingleClientWifiConfigurationSyncTest, + ShouldDownloadSingleWifiConfiguration) { + const std::string kTestSsid = "test_wifi"; + InjectKeystoreEncryptedServerWifiConfiguration( + GetFakeServer(), + /*unencrypted_specifics=*/chromeos::sync_wifi::GenerateTestWifiSpecifics( + chromeos::sync_wifi::GeneratePskNetworkId(kTestSsid))); + + ASSERT_TRUE(SetupSync()); + SetupShill(); + + EXPECT_TRUE( + LocalWifiConfigurationChecker(remote_cros_network_config(), kTestSsid) + .Wait()); +} + +// Regression test for crbug.com/1318390: the client should clear metadata when +// sync requires it and perform initial sync again (was crashing before the +// fix). +IN_PROC_BROWSER_TEST_F(SingleClientWifiConfigurationSyncTest, + ShouldHandleClientDataObsolete) { + const std::string kTestSsid1 = "test_wifi"; + InjectKeystoreEncryptedServerWifiConfiguration( + GetFakeServer(), + /*unencrypted_specifics=*/chromeos::sync_wifi::GenerateTestWifiSpecifics( + chromeos::sync_wifi::GeneratePskNetworkId(kTestSsid1))); + + ASSERT_TRUE(SetupSync()); + SetupShill(); + ASSERT_TRUE( + LocalWifiConfigurationChecker(remote_cros_network_config(), kTestSsid1) + .Wait()); + + GetFakeServer()->TriggerError(sync_pb::SyncEnums::CLIENT_DATA_OBSOLETE); + + // Trigger sync by making one more change. + const std::string kTestSsid2 = "test_wifi2"; + InjectKeystoreEncryptedServerWifiConfiguration( + GetFakeServer(), + /*unencrypted_specifics=*/chromeos::sync_wifi::GenerateTestWifiSpecifics( + chromeos::sync_wifi::GeneratePskNetworkId(kTestSsid2))); + ASSERT_TRUE(syncer::SyncEngineStoppedChecker(GetSyncService(0)).Wait()); + + // Make server return SUCCESS so that sync can initialize. + GetFakeServer()->TriggerError(sync_pb::SyncEnums::SUCCESS); + ASSERT_TRUE(GetClient(0)->AwaitEngineInitialization()); + + // Ensure client has both networks. + EXPECT_TRUE( + LocalWifiConfigurationChecker(remote_cros_network_config(), kTestSsid1) + .Wait()); + EXPECT_TRUE( + LocalWifiConfigurationChecker(remote_cros_network_config(), kTestSsid2) + .Wait()); +} + +} // namespace
diff --git a/chrome/browser/sync/test/integration/sync_engine_stopped_checker.cc b/chrome/browser/sync/test/integration/sync_engine_stopped_checker.cc new file mode 100644 index 0000000..9d55bb7f --- /dev/null +++ b/chrome/browser/sync/test/integration/sync_engine_stopped_checker.cc
@@ -0,0 +1,19 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sync/test/integration/sync_engine_stopped_checker.h" + +namespace syncer { + +SyncEngineStoppedChecker::SyncEngineStoppedChecker( + syncer::SyncServiceImpl* service) + : SingleClientStatusChangeChecker(service) {} + +// StatusChangeChecker implementation. +bool SyncEngineStoppedChecker::IsExitConditionSatisfied(std::ostream* os) { + *os << "Waiting for sync to stop"; + return !service()->IsEngineInitialized(); +} + +} // namespace syncer
diff --git a/chrome/browser/sync/test/integration/sync_engine_stopped_checker.h b/chrome/browser/sync/test/integration/sync_engine_stopped_checker.h new file mode 100644 index 0000000..22555872 --- /dev/null +++ b/chrome/browser/sync/test/integration/sync_engine_stopped_checker.h
@@ -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. + +#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_ENGINE_STOPPED_CHECKER_H_ +#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_ENGINE_STOPPED_CHECKER_H_ + +#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" + +namespace syncer { + +// A helper class to wait for sync engine being stopped. Common usecase is to +// wait for CLIENT_DATA_OBSOLETE being handled. +class SyncEngineStoppedChecker : public SingleClientStatusChangeChecker { + public: + explicit SyncEngineStoppedChecker(syncer::SyncServiceImpl* service); + SyncEngineStoppedChecker(const SyncEngineStoppedChecker&) = delete; + SyncEngineStoppedChecker& operator=(const SyncEngineStoppedChecker&) = delete; + ~SyncEngineStoppedChecker() override = default; + + // StatusChangeChecker implementation. + bool IsExitConditionSatisfied(std::ostream* os) override; +}; + +} // namespace syncer + +#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_ENGINE_STOPPED_CHECKER_H_
diff --git a/chrome/browser/sync/test/integration/sync_errors_test.cc b/chrome/browser/sync/test/integration/sync_errors_test.cc index 0c56dcda..b8744ede 100644 --- a/chrome/browser/sync/test/integration/sync_errors_test.cc +++ b/chrome/browser/sync/test/integration/sync_errors_test.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/sync/test/integration/fake_server_match_status_checker.h" #include "chrome/browser/sync/test/integration/preferences_helper.h" #include "chrome/browser/sync/test/integration/sync_disabled_checker.h" +#include "chrome/browser/sync/test/integration/sync_engine_stopped_checker.h" #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" @@ -51,18 +52,6 @@ return throttled_types; } -class SyncEngineStoppedChecker : public SingleClientStatusChangeChecker { - public: - explicit SyncEngineStoppedChecker(SyncServiceImpl* service) - : SingleClientStatusChangeChecker(service) {} - - // StatusChangeChecker implementation. - bool IsExitConditionSatisfied(std::ostream* os) override { - *os << "Waiting for sync to stop"; - return !service()->IsEngineInitialized(); - } -}; - class TypeDisabledChecker : public SingleClientStatusChangeChecker { public: explicit TypeDisabledChecker(SyncServiceImpl* service, syncer::ModelType type) @@ -144,19 +133,15 @@ IN_PROC_BROWSER_TEST_F(SyncErrorTest, BirthdayErrorTest) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - // Add an item, wait for sync, and trigger a birthday error on the server. - const BookmarkNode* node1 = AddFolder(0, 0, "title1"); - SetTitle(0, node1, "new_title1"); - ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); + // Clearing the server data resets the server birthday and triggers a NIGORI + // invalidation. This triggers a sync cycle and a GetUpdates request that runs + // into NOT_MY_BIRTHDAY. GetFakeServer()->ClearServerData(); - // Now make one more change so we will do another sync. - const BookmarkNode* node2 = AddFolder(0, 0, "title2"); - SetTitle(0, node2, "new_title2"); ASSERT_TRUE(SyncDisabledChecker(GetSyncService(0)).Wait()); } -IN_PROC_BROWSER_TEST_F(SyncErrorTest, ActionableErrorTest) { +IN_PROC_BROWSER_TEST_F(SyncErrorTest, UpgradeClientErrorDuringIncrementalSync) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; const BookmarkNode* node1 = AddFolder(0, 0, "title1"); @@ -165,7 +150,7 @@ std::string description = "Not My Fault"; std::string url = "www.google.com"; - GetFakeServer()->TriggerActionableError(sync_pb::SyncEnums::TRANSIENT_ERROR, + GetFakeServer()->TriggerActionableError(sync_pb::SyncEnums::THROTTLED, description, url, sync_pb::SyncEnums::UPGRADE_CLIENT); @@ -174,15 +159,46 @@ SetTitle(0, node2, "new_title2"); // Wait until an actionable error is encountered. - ASSERT_TRUE(ActionableErrorChecker(GetSyncService(0)).Wait()); + EXPECT_TRUE(ActionableErrorChecker(GetSyncService(0)).Wait()); // UPGRADE_CLIENT gets mapped to an unrecoverable error, so Sync will *not* // start up again in transport-only mode (which would clear the cached error). + EXPECT_EQ(syncer::SyncService::TransportState::DISABLED, + GetSyncService(0)->GetTransportState()); + syncer::SyncStatus status; GetSyncService(0)->QueryDetailedSyncStatusForDebugging(&status); - ASSERT_EQ(status.sync_protocol_error.error_type, syncer::TRANSIENT_ERROR); - ASSERT_EQ(status.sync_protocol_error.action, syncer::UPGRADE_CLIENT); - ASSERT_EQ(status.sync_protocol_error.error_description, description); + EXPECT_EQ(status.sync_protocol_error.error_type, syncer::THROTTLED); + EXPECT_EQ(status.sync_protocol_error.action, syncer::UPGRADE_CLIENT); + EXPECT_EQ(status.sync_protocol_error.error_description, description); +} + +IN_PROC_BROWSER_TEST_F(SyncErrorTest, UpgradeClientErrorDuringInitialSync) { + std::string description = "Not My Fault"; + std::string url = "www.google.com"; + GetFakeServer()->TriggerActionableError(sync_pb::SyncEnums::THROTTLED, + description, url, + sync_pb::SyncEnums::UPGRADE_CLIENT); + + ASSERT_TRUE(SetupClients()); + + // Signing in should start sync-the-transport, which should fail with an + // error. + ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); + + // Wait until an actionable error is encountered. + EXPECT_TRUE(ActionableErrorChecker(GetSyncService(0)).Wait()); + + // UPGRADE_CLIENT gets mapped to an unrecoverable error, so Sync will *not* + // start up again in transport-only mode (which would clear the cached error). + EXPECT_EQ(syncer::SyncService::TransportState::DISABLED, + GetSyncService(0)->GetTransportState()); + + syncer::SyncStatus status; + GetSyncService(0)->QueryDetailedSyncStatusForDebugging(&status); + EXPECT_EQ(status.sync_protocol_error.error_type, syncer::THROTTLED); + EXPECT_EQ(status.sync_protocol_error.action, syncer::UPGRADE_CLIENT); + EXPECT_EQ(status.sync_protocol_error.error_description, description); } // This test verifies that sync keeps retrying if it encounters error during @@ -220,35 +236,6 @@ #endif } -IN_PROC_BROWSER_TEST_F(SyncErrorTest, BirthdayErrorUsingActionableErrorTest) { - ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - - const BookmarkNode* node1 = AddFolder(0, 0, "title1"); - SetTitle(0, node1, "new_title1"); - ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); - - // Clear the server data so that the birthday gets incremented, and also send - // an appropriate error. - GetFakeServer()->ClearServerData(); - GetFakeServer()->TriggerActionableError(sync_pb::SyncEnums::NOT_MY_BIRTHDAY, - "Not My Fault", "www.google.com", - sync_pb::SyncEnums::UNKNOWN_ACTION); - - // Now make one more change so we will do another sync. - const BookmarkNode* node2 = AddFolder(0, 0, "title2"); - SetTitle(0, node2, "new_title2"); - - SyncDisabledChecker sync_disabled(GetSyncService(0)); - sync_disabled.Wait(); - - // On receiving the error, the SyncService will immediately start up again - // in transport mode, which resets the status. So check the status that the - // checker recorded at the time Sync was off. - syncer::SyncStatus status = sync_disabled.status_on_sync_disabled(); - EXPECT_EQ(status.sync_protocol_error.error_type, syncer::NOT_MY_BIRTHDAY); - EXPECT_EQ(status.sync_protocol_error.action, syncer::DISABLE_SYNC_ON_CLIENT); -} - // Tests that on receiving CLIENT_DATA_OBSOLETE sync engine gets restarted and // initialized with different cache_guid. IN_PROC_BROWSER_TEST_F(SyncErrorTest, ClientDataObsoleteTest) { @@ -272,7 +259,7 @@ const BookmarkNode* node2 = AddFolder(0, 0, "title2"); SetTitle(0, node2, "new_title2"); - ASSERT_TRUE(SyncEngineStoppedChecker(GetSyncService(0)).Wait()); + ASSERT_TRUE(syncer::SyncEngineStoppedChecker(GetSyncService(0)).Wait()); // Make server return SUCCESS so that sync can initialize. GetFakeServer()->TriggerError(sync_pb::SyncEnums::SUCCESS);
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc b/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc index 18de314..40dcc53 100644 --- a/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc +++ b/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc
@@ -1192,9 +1192,17 @@ helper_.CheckLaunchIconShown(); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1214,9 +1222,17 @@ helper_.CheckRunOnOsLoginEnabled(Site::kSiteA); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1236,9 +1252,17 @@ helper_.CheckRunOnOsLoginEnabled(Site::kSiteA); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1258,9 +1282,17 @@ helper_.CheckRunOnOsLoginEnabled(Site::kSiteA); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1280,9 +1312,17 @@ helper_.CheckRunOnOsLoginEnabled(Site::kSiteA); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1302,9 +1342,17 @@ helper_.CheckRunOnOsLoginEnabled(Site::kSiteA); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_31SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1324,9 +1372,17 @@ helper_.CheckRunOnOsLoginEnabled(Site::kSiteA); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_10SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1346,9 +1402,17 @@ helper_.CheckRunOnOsLoginEnabled(Site::kSiteA); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_43SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1368,9 +1432,17 @@ helper_.CheckRunOnOsLoginEnabled(Site::kSiteA); } +// TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + DISABLED_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#else +#define MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA \ + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA +#endif IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { + MAYBE_WebAppIntegration_47SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_40Client1_41_98SiteA_40Client2_102SiteA_107SiteA_46SiteA_106SiteA) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported.
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java index 339e955..fc2c6a7 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java
@@ -75,9 +75,6 @@ ListModel<ListItem> sheetItems = mModel.get(SHEET_ITEMS); sheetItems.clear(); - // For the single-credential case, don't include a note about about submission because in - // that case there is a button which title signifies about submission. - boolean show_submit_subtitle = triggerSubmission && (credentials.size() > 1); sheetItems.add(new ListItem(TouchToFillProperties.ItemType.HEADER, new PropertyModel.Builder(HeaderProperties.ALL_KEYS) .with(SINGLE_CREDENTIAL, credentials.size() == 1) @@ -85,7 +82,7 @@ UrlFormatter.formatUrlForSecurityDisplay( url, SchemeDisplay.OMIT_HTTP_AND_HTTPS)) .with(ORIGIN_SECURE, isOriginSecure) - .with(SHOW_SUBMIT_SUBTITLE, show_submit_subtitle) + .with(SHOW_SUBMIT_SUBTITLE, triggerSubmission) .with(IMAGE_DRAWABLE_ID, resourceProvider.getHeaderImageDrawableId()) .build()));
diff --git a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java index 365bea7..9611750 100644 --- a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java +++ b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
@@ -188,8 +188,7 @@ assertThat(itemList.size(), is(3)); // Header + 1 credential + Button assertThat(itemList.get(0).type, is(ItemType.HEADER)); - // Don't show a special subtitle - the button's text is enough. - assertThat(itemList.get(0).model.get(SHOW_SUBMIT_SUBTITLE), is(false)); + assertThat(itemList.get(0).model.get(SHOW_SUBMIT_SUBTITLE), is(true)); assertThat(itemList.get(2).type, is(ItemType.FILL_BUTTON)); assertThat(itemList.get(2).model.get(SHOW_SUBMIT_BUTTON), is(true));
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoController.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoController.java index df992846..96a9f73 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoController.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoController.java
@@ -496,7 +496,11 @@ view.getDescription().setText(mDescriptionStringIdNoAccount); - view.getPrimaryButton().setText(R.string.sync_promo_turn_on_sync); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON)) { + view.getPrimaryButton().setText(R.string.sync_promo_continue); + } else { + view.getPrimaryButton().setText(R.string.sync_promo_turn_on_sync); + } view.getPrimaryButton().setOnClickListener(v -> signinWithNewAccount(context)); view.getSecondaryButton().setVisibility(View.GONE); @@ -511,19 +515,24 @@ view.getDescription().setText(mDescriptionStringId); view.getPrimaryButton().setOnClickListener(v -> signinWithDefaultAccount(context)); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON)) { + view.getPrimaryButton().setText(R.string.sync_promo_continue); + view.getSecondaryButton().setVisibility(View.GONE); + return; + } if (IdentityServicesProvider.get() .getIdentityManager(Profile.getLastUsedRegularProfile()) .hasPrimaryAccount(ConsentLevel.SIGNIN)) { view.getPrimaryButton().setText(R.string.sync_promo_turn_on_sync); view.getSecondaryButton().setVisibility(View.GONE); - } else { - view.getPrimaryButton().setText(context.getString(R.string.signin_promo_continue_as, - mProfileData.getGivenNameOrFullNameOrEmail())); - - view.getSecondaryButton().setText(R.string.signin_promo_choose_another_account); - view.getSecondaryButton().setOnClickListener(v -> signinWithNotDefaultAccount(context)); - view.getSecondaryButton().setVisibility(View.VISIBLE); + return; } + view.getPrimaryButton().setText(context.getString( + R.string.signin_promo_continue_as, mProfileData.getGivenNameOrFullNameOrEmail())); + + view.getSecondaryButton().setText(R.string.signin_promo_choose_another_account); + view.getSecondaryButton().setOnClickListener(v -> signinWithNotDefaultAccount(context)); + view.getSecondaryButton().setVisibility(View.VISIBLE); } private int getNumImpressions() {
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java index a5d47b4..57f6d99 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java
@@ -31,11 +31,14 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.signin.services.ProfileDataCache; import org.chromium.chrome.browser.ui.signin.SyncConsentActivityLauncher.AccessPoint; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule; import org.chromium.chrome.test.util.browser.signin.SigninTestUtil; import org.chromium.components.signin.base.CoreAccountInfo; @@ -137,7 +140,10 @@ @Test @MediumTest @Feature("RenderTest") - public void testBookmarkSyncPromoViewSignedOutAndNoAccountAvailable() throws Throwable { + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testBookmarkSyncPromoViewSignedOutAndNoAccountAvailableWithSingleButtonFeatureDisabled() + throws Throwable { View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { ProfileDataCache profileDataCache = ProfileDataCache.createWithDefaultImageSizeAndNoBadge( @@ -156,7 +162,32 @@ @Test @MediumTest @Feature("RenderTest") - public void testBookmarkSyncPromoViewSignedOutAndAccountAvailable() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testBookmarkSyncPromoViewSignedOutAndNoAccountAvailableWithSingleButtonFeatureEnabled() + throws Throwable { + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + ProfileDataCache profileDataCache = + ProfileDataCache.createWithDefaultImageSizeAndNoBadge( + mActivityTestRule.getActivity()); + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_bookmarks, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.BOOKMARK_MANAGER, profileDataCache); + return promoView; + }); + mRenderTestRule.render( + view, "bookmark_sync_promo_single_button_signed_out_and_no_account_available"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testBookmarkSyncPromoViewSignedOutAndAccountAvailableWithSingleButtonFeatureDisabled() + throws Throwable { mAccountManagerTestRule.addAccount(TEST_EMAIL); ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { @@ -173,7 +204,30 @@ @Test @MediumTest @Feature("RenderTest") - public void testBookmarkSyncPromoViewSignedInAndNotSyncing() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testBookmarkSyncPromoViewSignedOutAndAccountAvailableWithSingleButtonFeatureEnabled() + throws Throwable { + mAccountManagerTestRule.addAccount(TEST_EMAIL); + ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_bookmarks, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.BOOKMARK_MANAGER, profileDataCache); + return promoView; + }); + mRenderTestRule.render( + view, "bookmark_sync_promo_single_button_signed_out_and_account_available"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void testBookmarkSyncPromoViewSignedInAndNotSyncingWithSingleButtonFeatureDisabled() + throws Throwable { CoreAccountInfo coreAccountInfo = mAccountManagerTestRule.addAccountAndWaitForSeeding(TEST_EMAIL); SigninTestUtil.signin(coreAccountInfo); @@ -192,7 +246,31 @@ @Test @MediumTest @Feature("RenderTest") - public void testSettingsSyncPromoViewSignedOutAndNoAccountAvailable() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void testBookmarkSyncPromoViewSignedInAndNotSyncingWithSingleButtonFeatureEnabled() + throws Throwable { + CoreAccountInfo coreAccountInfo = + mAccountManagerTestRule.addAccountAndWaitForSeeding(TEST_EMAIL); + SigninTestUtil.signin(coreAccountInfo); + ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_bookmarks, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.BOOKMARK_MANAGER, profileDataCache); + return promoView; + }); + mRenderTestRule.render(view, "bookmark_sync_promo_single_button_signed_in_and_not_syncing"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testSettingsSyncPromoViewSignedOutAndNoAccountAvailableWithSingleButtonFeatureDisabled() + throws Throwable { View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { ProfileDataCache profileDataCache = ProfileDataCache.createWithDefaultImageSizeAndNoBadge( @@ -211,7 +289,32 @@ @Test @MediumTest @Feature("RenderTest") - public void testSettingsSyncPromoViewSignedOutAndAccountAvailable() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testSettingsSyncPromoViewSignedOutAndNoAccountAvailableWithSingleButtonFeatureEnabled() + throws Throwable { + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + ProfileDataCache profileDataCache = + ProfileDataCache.createWithDefaultImageSizeAndNoBadge( + mActivityTestRule.getActivity()); + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_settings, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.SETTINGS, profileDataCache); + return promoView; + }); + mRenderTestRule.render( + view, "settings_sync_promo_single_button_signed_out_and_no_account_available"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testSettingsSyncPromoViewSignedOutAndAccountAvailableWithSingleButtonFeatureDisabled() + throws Throwable { mAccountManagerTestRule.addAccount(TEST_EMAIL); ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { @@ -228,7 +331,30 @@ @Test @MediumTest @Feature("RenderTest") - public void testSettingsSyncPromoViewSignedInAndNotSyncing() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testSettingsSyncPromoViewSignedOutAndAccountAvailableWithSingleButtonFeatureEnabled() + throws Throwable { + mAccountManagerTestRule.addAccount(TEST_EMAIL); + ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_settings, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.SETTINGS, profileDataCache); + return promoView; + }); + mRenderTestRule.render( + view, "settings_sync_promo_single_button_signed_out_and_account_available"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void testSettingsSyncPromoViewSignedInAndNotSyncingWithSingleButtonFeatureDisabled() + throws Throwable { CoreAccountInfo coreAccountInfo = mAccountManagerTestRule.addAccountAndWaitForSeeding(TEST_EMAIL); SigninTestUtil.signin(coreAccountInfo); @@ -247,7 +373,31 @@ @Test @MediumTest @Feature("RenderTest") - public void testRecentTabsSyncPromoViewSignedOutAndNoAccountAvailable() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void testSettingsSyncPromoViewSignedInAndNotSyncingWithSingleButtonFeatureEnabled() + throws Throwable { + CoreAccountInfo coreAccountInfo = + mAccountManagerTestRule.addAccountAndWaitForSeeding(TEST_EMAIL); + SigninTestUtil.signin(coreAccountInfo); + ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_settings, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.SETTINGS, profileDataCache); + return promoView; + }); + mRenderTestRule.render(view, "settings_sync_promo_single_button_signed_in_and_not_syncing"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testRecentTabsSyncPromoViewSignedOutAndNoAccountAvailableWithSingleButtonFeatureDisabled() + throws Throwable { View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { ProfileDataCache profileDataCache = ProfileDataCache.createWithDefaultImageSizeAndNoBadge( @@ -266,7 +416,32 @@ @Test @MediumTest @Feature("RenderTest") - public void testRecentTabsSyncPromoViewSignedOutAndAccountAvailable() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testRecentTabsSyncPromoViewSignedOutAndNoAccountAvailableWithSingleButtonFeatureEnabled() + throws Throwable { + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + ProfileDataCache profileDataCache = + ProfileDataCache.createWithDefaultImageSizeAndNoBadge( + mActivityTestRule.getActivity()); + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_recent_tabs, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.RECENT_TABS, profileDataCache); + return promoView; + }); + mRenderTestRule.render( + view, "recent_tabs_sync_promo_single_button_signed_out_and_no_account_available"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testRecentTabsSyncPromoViewSignedOutAndAccountAvailableWithSingleButtonFeatureDisabled() + throws Throwable { mAccountManagerTestRule.addAccount(TEST_EMAIL); ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { @@ -284,7 +459,30 @@ @Test @MediumTest @Feature("RenderTest") - public void testRecentTabsSyncPromoViewSignedInAndNotSyncing() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testRecentTabsSyncPromoViewSignedOutAndAccountAvailableWithSingleButtonFeatureEnabled() + throws Throwable { + mAccountManagerTestRule.addAccount(TEST_EMAIL); + ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_recent_tabs, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.RECENT_TABS, profileDataCache); + return promoView; + }); + mRenderTestRule.render( + view, "recent_tabs_sync_promo_single_button_signed_out_and_account_available"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void testRecentTabsSyncPromoViewSignedInAndNotSyncingWithSingleButtonFeatureDisabled() + throws Throwable { CoreAccountInfo coreAccountInfo = mAccountManagerTestRule.addAccountAndWaitForSeeding(TEST_EMAIL); SigninTestUtil.signin(coreAccountInfo); @@ -303,7 +501,31 @@ @Test @MediumTest @Feature("RenderTest") - public void testNTPContentSuggestionsSyncPromoViewSignedOutAndNoAccountAvailable() + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void testRecentTabsSyncPromoViewSignedInAndNotSyncingWithSingleButtonFeatureEnabled() + throws Throwable { + CoreAccountInfo coreAccountInfo = + mAccountManagerTestRule.addAccountAndWaitForSeeding(TEST_EMAIL); + SigninTestUtil.signin(coreAccountInfo); + ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate(R.layout.personalized_signin_promo_view_recent_tabs, null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.RECENT_TABS, profileDataCache); + return promoView; + }); + mRenderTestRule.render( + view, "recent_tabs_sync_promo_single_button_signed_in_and_not_syncing"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testNTPContentSuggestionsSyncPromoViewSignedOutAndNoAccountAvailableWithSingleButtonFeatureDisabled() throws Throwable { View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { ProfileDataCache profileDataCache = @@ -325,7 +547,33 @@ @Test @MediumTest @Feature("RenderTest") - public void testNTPContentSuggestionsSyncPromoViewSignedOutAndAccountAvailable() + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testNTPContentSuggestionsSyncPromoViewSignedOutAndNoAccountAvailableWithSingleButtonFeatureEnabled() + throws Throwable { + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + ProfileDataCache profileDataCache = + ProfileDataCache.createWithDefaultImageSizeAndNoBadge( + mActivityTestRule.getActivity()); + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate( + R.layout.personalized_signin_promo_view_modern_content_suggestions, + null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.NTP_CONTENT_SUGGESTIONS, profileDataCache); + return promoView; + }); + mRenderTestRule.render(view, + "ntp_content_suggestions_sync_promo_single_button_signed_out_and_no_account_available"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testNTPContentSuggestionsSyncPromoViewSignedOutAndAccountAvailableWithSingleButtonFeatureDisabled() throws Throwable { mAccountManagerTestRule.addAccount(TEST_EMAIL); ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); @@ -346,7 +594,33 @@ @Test @MediumTest @Feature("RenderTest") - public void testNTPContentSuggestionsSyncPromoViewSignedInAndNotSyncing() throws Throwable { + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testNTPContentSuggestionsSyncPromoViewSignedOutAndAccountAvailableWithSingleButtonFeatureEnabled() + throws Throwable { + mAccountManagerTestRule.addAccount(TEST_EMAIL); + ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate( + R.layout.personalized_signin_promo_view_modern_content_suggestions, + null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.NTP_CONTENT_SUGGESTIONS, profileDataCache); + return promoView; + }); + mRenderTestRule.render(view, + "ntp_content_suggestions_sync_promo_single_button_signed_out_and_account_available"); + } + + @Test + @MediumTest + @Feature("RenderTest") + @DisableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testNTPContentSuggestionsSyncPromoViewSignedInAndNotSyncingWithSingleButtonFeatureDisabled() + throws Throwable { CoreAccountInfo coreAccountInfo = mAccountManagerTestRule.addAccountAndWaitForSeeding(TEST_EMAIL); SigninTestUtil.signin(coreAccountInfo); @@ -364,4 +638,29 @@ mRenderTestRule.render( view, "ntp_content_suggestions_sync_promo_view_signed_in_and_not_syncing"); } + + @Test + @MediumTest + @Feature("RenderTest") + @EnableFeatures({ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON}) + public void + testNTPContentSuggestionsSyncPromoViewSignedInAndNotSyncingWithSingleButtonFeatureEnabled() + throws Throwable { + CoreAccountInfo coreAccountInfo = + mAccountManagerTestRule.addAccountAndWaitForSeeding(TEST_EMAIL); + SigninTestUtil.signin(coreAccountInfo); + ProfileDataCache profileDataCache = createProfileDataCacheAndWaitForAccountData(); + View view = TestThreadUtils.runOnUiThreadBlockingNoException(() -> { + View promoView = + LayoutInflater.from(mActivityTestRule.getActivity()) + .inflate( + R.layout.personalized_signin_promo_view_modern_content_suggestions, + null); + setContentViewAndSetUpSyncPromoView( + promoView, SigninAccessPoint.NTP_CONTENT_SUGGESTIONS, profileDataCache); + return promoView; + }); + mRenderTestRule.render( + view, "ntp_content_suggestions_sync_promo_single_button_signed_in_and_not_syncing"); + } } \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index d77a1f9..e8b4293 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2908,6 +2908,9 @@ <message name="IDS_SYNC_PROMO_TURN_ON_SYNC" desc="Button that the user can press if they want to turn on sync with this account."> Turn on sync </message> + <message name="IDS_SYNC_PROMO_CONTINUE" desc="This string is the button of a card that asks the user to turn on sync; the user may be signed in to Chrome, but isn't syncing their Chrome data. We want users to read this card and consider tapping the 'Continue' button and turn on sync. [CHAR_LIMIT=30] instead." meaning="Open the screen where the user can turn on sync"> + Continue + </message> <message name="IDS_EXTERNAL_APP_RESTRICTED_ACCESS_ERROR" desc="A message shown to the user if Chrome receives a file view request to something Chrome does not have access to view."> Chrome does not have access to the requested resource.
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_PROMO_CONTINUE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_PROMO_CONTINUE.png.sha1 new file mode 100644 index 0000000..28f2c0a --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_PROMO_CONTINUE.png.sha1
@@ -0,0 +1 @@ +e1056f37f92ce6fcbe0416c8b030ec9500092885 \ No newline at end of file
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 ce9724d..56813f46 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
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Hierdie vanlyn bladsy is van <ph name="CREATION_TIME" /> af en kan van die aanlyn weergawe verskil.</translation> <translation id="4616150815774728855">Maak <ph name="WEBAPK_NAME" /> oop</translation> <translation id="4619564267100705184">Verifieer dis jy</translation> +<translation id="4627165777145349100">Meer oor hierdie bladsy</translation> <translation id="4634124774493850572">Gebruik wagwoord</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 gekompromitteerde wagwoord}other{# gekompromitteerde wagwoorde}}</translation> <translation id="4650364565596261010">Stelsel se verstek</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index f7bbed9..5394774 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Гэта пазасеткавая старонка створана <ph name="CREATION_TIME" /> і можа адрознівацца ад сваёй інтэрнэт-версіі.</translation> <translation id="4616150815774728855">Адкрыць <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Пацвердзіць маю асобу</translation> +<translation id="4627165777145349100">Падрабязней пра гэту старонку</translation> <translation id="4634124774493850572">Выкарыстаць пароль</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Адзін раскрыты пароль}one{# раскрыты пароль}few{# раскрытыя паролі}many{# раскрытых пароляў}other{# раскрытага пароля}}</translation> <translation id="4650364565596261010">Стандартная сістэмная</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index d939b64..e502831b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Тази офлайн страница е от <ph name="CREATION_TIME" /> и може да се различава от онлайн версията.</translation> <translation id="4616150815774728855">Отваряне на <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Потвърдете, че сте вие</translation> +<translation id="4627165777145349100">Още за тази страница</translation> <translation id="4634124774493850572">Използване на паролата</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 компрометирана парола}other{# компрометирани пароли}}</translation> <translation id="4650364565596261010">Стандартно за системата</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 311e1c90..39d6596 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Aquesta pàgina sense connexió és del dia <ph name="CREATION_TIME" /> i pot ser diferent de la versió en línia.</translation> <translation id="4616150815774728855">Obre <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Verifica la teva identitat</translation> +<translation id="4627165777145349100">Més informació sobre aquesta pàgina</translation> <translation id="4634124774493850572">Fes servir la contrasenya</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 contrasenya en perill}other{# contrasenyes en perill}}</translation> <translation id="4650364565596261010">Opció predeterminada del sistema</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index d4762b62..7241f35 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Tato offline stránka je z <ph name="CREATION_TIME" /> a může se od online verze lišit.</translation> <translation id="4616150815774728855">Do aplikace <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Ověřte svou totožnost</translation> +<translation id="4627165777145349100">Další informace o této stránce</translation> <translation id="4634124774493850572">Použít heslo</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Bylo nalezeno jedno prolomené heslo}few{Byla nalezena # prolomená hesla}many{Bylo nalezeno # prolomeného hesla}other{Bylo nalezeno # prolomených hesel}}</translation> <translation id="4650364565596261010">Výchozí nastavení systému</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb index b73b4bb..98022ea 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Daw'r dudalen all-lein hon o <ph name="CREATION_TIME" /> a gall fod yn wahanol i'r fersiwn ar-lein.</translation> <translation id="4616150815774728855">Agor <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Cadarnhewch mai chi sydd yno</translation> +<translation id="4627165777145349100">Rhagor am y dudalen hon</translation> <translation id="4634124774493850572">Defnyddio cyfrinair</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 cyfrinair sydd wedi'i ddarganfod}zero{# cyfrinair sydd wedi'u darganfod}two{# gyfrinair sydd wedi'u darganfod}few{# chyfrinair sydd wedi'u darganfod}many{# chyfrinair mewn perygl}other{# cyfrinair sydd wedi'u darganfod}}</translation> <translation id="4650364565596261010">System ddiofyn</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index d9467c5..dfd87d1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Diese Offlineseite ist vom <ph name="CREATION_TIME" /> und unterscheidet sich gegebenenfalls von der Onlineversion.</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> öffnen</translation> <translation id="4619564267100705184">Identität bestätigen</translation> +<translation id="4627165777145349100">Mehr über diese Seite</translation> <translation id="4634124774493850572">Passwort verwenden</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 gehacktes Passwort}other{# gehackte Passwörter}}</translation> <translation id="4650364565596261010">Systemstandard</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index d00b68b..bd14bfb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Esta página sin conexión se creó el <ph name="CREATION_TIME" /> y es posible que sea diferente con respecto a la versión en línea.</translation> <translation id="4616150815774728855">Abrir <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Verificar tu identidad</translation> +<translation id="4627165777145349100">Más información sobre esta página</translation> <translation id="4634124774493850572">Usar contraseña</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 contraseña hackeada}other{# contraseñas hackeadas}}</translation> <translation id="4650364565596261010">Predeterminado del sistema</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index d91c71cb..06e3dab 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Esta página sin conexión se creó el <ph name="CREATION_TIME" /> y puede ser distinta de la versión online.</translation> <translation id="4616150815774728855">Abrir <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Verificar mi identidad</translation> +<translation id="4627165777145349100">Más sobre esta página</translation> <translation id="4634124774493850572">Utilizar contraseña</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 contraseña vulnerada}other{# contraseñas vulneradas}}</translation> <translation id="4650364565596261010">Predeterminado del sistema</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index c4eb7cf..c6ed2ed 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Võrguühenduseta leht loodi <ph name="CREATION_TIME" /> ja see võib veebiversioonist erineda.</translation> <translation id="4616150815774728855">Ava <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Kinnitage, et see olete teie</translation> +<translation id="4627165777145349100">Lisateave selle lehe kohta</translation> <translation id="4634124774493850572">Kasuta parooli</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 parool on ohus}other{# parooli on ohus}}</translation> <translation id="4650364565596261010">Süsteemi vaikeseade</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index 671a82e..e2e5680 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -531,7 +531,7 @@ <translation id="3928666092801078803">Bateratu nire datuak</translation> <translation id="3932390316856284148">Pantailaren behealdean ainguratutako orria, saioa hasteko balio duena, altuera osoan irekita dago.</translation> <translation id="3934366560681368531">"</translation> -<translation id="393697183122708255">Ez dago ahots bidezko bilaketarik gaituta</translation> +<translation id="393697183122708255">Ez dago ahozko bilaketarik gaituta</translation> <translation id="395377504920307820">Erabili konturik gabe</translation> <translation id="3958287878205277013">Gailuan gordetako ezkutuko moduko arakatze-historia ezabatzeko, itxi ezkutuko moduko fitxa guztiak.</translation> <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Gailua konektatu egiten denean kargatuko du Chrome-k orria}other{Gailua konektatu egiten denean kargatuko ditu Chrome-k orriak}}</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 3a1c0dc..8f34dbd 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
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Cette page hors connexion a été créée le <ph name="CREATION_TIME" /> et peut différer de la version en ligne.</translation> <translation id="4616150815774728855">Ouvrir <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Confirmer que c'est bien vous</translation> +<translation id="4627165777145349100">En savoir plus sur cette page</translation> <translation id="4634124774493850572">Utiliser le mot de passe</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 mot de passe compromis}one{# mot de passe compromis}other{# mots de passe compromis}}</translation> <translation id="4650364565596261010">Paramètres par défaut</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index d9ec270..165561e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Cette page hors connexion date du <ph name="CREATION_TIME" /> et peut différer de la version en ligne.</translation> <translation id="4616150815774728855">Ouvrir <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Confirmer votre identité</translation> +<translation id="4627165777145349100">En savoir plus sur cette page</translation> <translation id="4634124774493850572">Utiliser le mot de passe</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 mot de passe compromis}one{# mot de passe compromis}other{# mots de passe compromis}}</translation> <translation id="4650364565596261010">Paramètre par défaut du système</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index c85b058..a959524 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Esta páxina sen conexión creouse o <ph name="CREATION_TIME" /> e pode ser diferente da versión en liña.</translation> <translation id="4616150815774728855">Abrir <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Verificar a túa identidade</translation> +<translation id="4627165777145349100">Máis información sobre esta páxina</translation> <translation id="4634124774493850572">Usar contrasinal</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 contrasinal vulnerado}other{# contrasinais vulnerados}}</translation> <translation id="4650364565596261010">Opción predeterminada do sistema</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 170e556..48b3c91 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Þessi síða án nettengingar er frá <ph name="CREATION_TIME" /> og hún gæti verið frábrugðin útgáfunni sem er á netinu.</translation> <translation id="4616150815774728855">Opna <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Staðfestu hver þú ert</translation> +<translation id="4627165777145349100">Nánar um þessa síðu</translation> <translation id="4634124774493850572">Nota aðgangsorð</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 aðgangsorð í hættu}one{# aðgangsorð í hættu}other{# aðgangsorð í hættu}}</translation> <translation id="4650364565596261010">Sjálfgildi kerfis</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index 539caaa..6bc96f3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">הדף האופליין הזה נוצר ב-<ph name="CREATION_TIME" /> ויכול להיות שהגרסה המקוונת שלו שונה.</translation> <translation id="4616150815774728855">פתיחה של <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">אימות הזהות שלך</translation> +<translation id="4627165777145349100">מידע נוסף על הדף הזה</translation> <translation id="4634124774493850572">שימוש בסיסמה</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{סיסמה אחת שנחשפה}two{# סיסמאות שנחשפו}many{# סיסמאות שנחשפו}other{# סיסמאות שנחשפו}}</translation> <translation id="4650364565596261010">ברירת מחדל של המערכת</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 e3e7edc2..cb0e6ebd 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
@@ -643,6 +643,7 @@ <translation id="4594952190837476234">ಈ ಆಫ್ಲೈನ್ ಪುಟವನ್ನು <ph name="CREATION_TIME" /> ರಂದು ರಚಿಸಲಾಗಿದೆ ಮತ್ತು ಇದು ಆನ್ಲೈನ್ ಆವೃತ್ತಿಗಿಂತ ಭಿನ್ನವಾಗಿರಬಹುದು.</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> ತೆರೆಯಿರಿ</translation> <translation id="4619564267100705184">ಇದು ನೀವೇ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಿ</translation> +<translation id="4627165777145349100">ಈ ಪುಟದ ಕುರಿತು ಇನ್ನಷ್ಟು</translation> <translation id="4634124774493850572">ಪಾಸ್ವರ್ಡ್ ಬಳಸಿ</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 ಪಾಸ್ವರ್ಡ್ ಅಪಾಯಕ್ಕೀಡಾಗಿದೆ}one{# ಪಾಸ್ವರ್ಡ್ಗಳು ಅಪಾಯಕ್ಕೀಡಾಗಿವೆ}other{# ಪಾಸ್ವರ್ಡ್ಗಳು ಅಪಾಯಕ್ಕೀಡಾಗಿವೆ}}</translation> <translation id="4650364565596261010">ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 6654582..35a58e8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">이 오프라인 페이지는 <ph name="CREATION_TIME" />에 생성되었으며 온라인 버전과 다를 수 있습니다.</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> 열기</translation> <translation id="4619564267100705184">본인 인증</translation> +<translation id="4627165777145349100">이 페이지 자세히 알아보기</translation> <translation id="4634124774493850572">비밀번호 사용</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{유출된 비밀번호 1개}other{유출된 비밀번호 #개}}</translation> <translation id="4650364565596261010">시스템 기본값</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index fc47894..22c5413 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">ໜ້າອອບລາຍນີ້ມາຈາກ <ph name="CREATION_TIME" /> ແລະ ອາດຈະແຕກຕ່າງຈາກເວີຊັນອອນລາຍ.</translation> <translation id="4616150815774728855">ເປີດ <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">ຢັ້ງຢືນວ່າແມ່ນທ່ານແທ້</translation> +<translation id="4627165777145349100">ເພີ່ມເຕີມກ່ຽວກັບໜ້ານີ້</translation> <translation id="4634124774493850572">ໃຊ້ລະຫັດຜ່ານ</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{ມີລະຫັດຜ່ານທີ່ຖືກລະເມີດ 1 ລາຍການ}other{ມີລະຫັດຜ່ານທີ່ຖືກລະເມີດ # ລາຍການ}}</translation> <translation id="4650364565596261010">ຄ່າເລີ່ມຕົ້ນຂອງລະບົບ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 0a45ec9..0f11fac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Šis neprisijungus naudojamas puslapis sukurtas <ph name="CREATION_TIME" />, todėl gali skirtis nuo prisijungus pateiktos versijos.</translation> <translation id="4616150815774728855">Atidaryti „<ph name="WEBAPK_NAME" />“</translation> <translation id="4619564267100705184">Patvirtinti tapatybę</translation> +<translation id="4627165777145349100">Daugiau apie šį puslapį</translation> <translation id="4634124774493850572">Naudoti slaptažodį</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 pažeistas slaptažodis}one{# pažeistas slaptažodis}few{# pažeisti slaptažodžiai}many{# pažeisto slaptažodžio}other{# pažeistų slaptažodžių}}</translation> <translation id="4650364565596261010">Sistemos numatytasis nustatymas</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 b6626180..02715b61 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
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Šī lapas bezsaistes versija (izveidota: <ph name="CREATION_TIME" />) var atšķirties no tiešsaistes versijas.</translation> <translation id="4616150815774728855">Atvērt <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Apstiprināt identitāti</translation> +<translation id="4627165777145349100">Vairāk par šo lapu</translation> <translation id="4634124774493850572">Izmantot paroli</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 uzlauzta parole}zero{# uzlauztu paroļu}one{# uzlauzta parole}other{# uzlauztas paroles}}</translation> <translation id="4650364565596261010">Sistēmas noklusējums</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index b59ef612..c729e95 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">ଏହି ପୃଷ୍ଠା <ph name="CREATION_TIME" />ର ଅଟେ ଏବଂ ଅନ୍ଲାଇନ୍ ସଂସ୍କରଣ ଠାରୁ ଅଲଗା ହୋଇପାରେ।</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> ଖୋଲନ୍ତୁ</translation> <translation id="4619564267100705184">ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ</translation> +<translation id="4627165777145349100">ଏହି ପୃଷ୍ଠା ବିଷୟରେ ଅଧିକ</translation> <translation id="4634124774493850572">ପାସ୍ୱର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1ଟି ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ}other{#ଟି ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ}}</translation> <translation id="4650364565596261010">ସିଷ୍ଟମ୍ ଡିଫଲ୍ଟ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index aec892a..81ca50c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">මෙම නොබැඳි පිටුව <ph name="CREATION_TIME" /> වෙතින් වන අතර සබැඳි අනුවාදයෙන් වෙනස් විය හැකිය.</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> විවෘත කරන්න</translation> <translation id="4619564267100705184">ඒ ඔබ බව සත්යාපනය කරන්න</translation> +<translation id="4627165777145349100">මෙම පිටුව පිළිබඳ වැඩිදුර</translation> <translation id="4634124774493850572">මුරපදය භාවිත කරන්න</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{අවදානමට පත් වූ මුරපද 1}one{අවදානමට පත් වූ මුරපද #}other{අවදානමට පත් වූ මුරපද #}}</translation> <translation id="4650364565596261010">පද්ධති පෙරනිමිය</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 94b3b30..b010fa1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Kjo faqe jashtë linje është nga <ph name="CREATION_TIME" /> dhe mund të ndryshojë nga versioni në linjë.</translation> <translation id="4616150815774728855">Hap <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Verifiko që je ti</translation> +<translation id="4627165777145349100">Më shumë rreth kësaj faqeje</translation> <translation id="4634124774493850572">Përdor fjalëkalimin</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 fjalëkalim i komprometuar}other{# fjalëkalime të komprometuara}}</translation> <translation id="4650364565596261010">Parazgjedhja e sistemit</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index 16fc3c0..3fcaee5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -645,6 +645,7 @@ <translation id="4594952190837476234">Den här offlinesidan sparades <ph name="CREATION_TIME" /> och kan skilja sig från onlineversionen.</translation> <translation id="4616150815774728855">Öppna <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Verifiera din identitet</translation> +<translation id="4627165777145349100">Mer om den här sidan</translation> <translation id="4634124774493850572">Använd lösenordet</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 utsatt lösenord}other{# utsatta lösenord}}</translation> <translation id="4650364565596261010">Systemets standardinställning</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index f2d7d4a2..23f2a5c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Ukurasa huu wa nje ya mtandao umetoka <ph name="CREATION_TIME" /> na huenda ukatofautiana na toleo lililo mtandaoni.</translation> <translation id="4616150815774728855">Fungua <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Thibitisha kwamba ni wewe</translation> +<translation id="4627165777145349100">Maelezo zaidi kuhusu ukurasa huu</translation> <translation id="4634124774493850572">Tumia nenosiri</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Nenosiri moja limeathiriwa}other{Manenosiri # yameathiriwa}}</translation> <translation id="4650364565596261010">Mipangilio chaguomsingi ya mfumo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 7ea0a54..76a7c07f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">Trang ngoại tuyến này được tạo từ lúc <ph name="CREATION_TIME" /> và có thể khác với phiên bản trực tuyến.</translation> <translation id="4616150815774728855">Mở <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">Xác minh danh tính của bạn</translation> +<translation id="4627165777145349100">Xem thêm về trang này</translation> <translation id="4634124774493850572">Sử dụng mật khẩu</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 mật khẩu bị lộ}other{# mật khẩu bị lộ}}</translation> <translation id="4650364565596261010">Tùy chọn mặc định của hệ thống</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 22fcd7f..18bb8be 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -644,6 +644,7 @@ <translation id="4594952190837476234">此离线网页是在 <ph name="CREATION_TIME" />创建的,可能与在线版本有所不同。</translation> <translation id="4616150815774728855">打开<ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">请验证是您本人在操作</translation> +<translation id="4627165777145349100">详细了解此页面</translation> <translation id="4634124774493850572">使用密码</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{有 1 个密码已遭泄露}other{有 # 个密码已遭泄露}}</translation> <translation id="4650364565596261010">系统默认设置</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index ae30c61..49240e3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -643,6 +643,7 @@ <translation id="4594952190837476234">這個離線版網頁是於 <ph name="CREATION_TIME" />建立,可能會和線上版本有所不同。</translation> <translation id="4616150815774728855">開啟 <ph name="WEBAPK_NAME" /></translation> <translation id="4619564267100705184">驗證身分</translation> +<translation id="4627165777145349100">進一步瞭解這個頁面</translation> <translation id="4634124774493850572">使用密碼</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{有 1 組密碼遭外洩}other{有 # 組密碼遭外洩}}</translation> <translation id="4650364565596261010">系統預設</translation>
diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h index 67dc46e..b5e1bdc6 100644 --- a/chrome/browser/ui/chrome_pages.h +++ b/chrome/browser/ui/chrome_pages.h
@@ -86,6 +86,7 @@ kFeedbackSourceConnectivityDiagnostics, kFeedbackSourceProjectorApp, kFeedbackSourceDesksTemplates, + kFeedbackSourceFilesApp, // Must be last. kFeedbackSourceCount,
diff --git a/chrome/browser/ui/passwords/password_generation_popup_controller_impl.cc b/chrome/browser/ui/passwords/password_generation_popup_controller_impl.cc index d613fd1..662d5fd 100644 --- a/chrome/browser/ui/passwords/password_generation_popup_controller_impl.cc +++ b/chrome/browser/ui/passwords/password_generation_popup_controller_impl.cc
@@ -31,6 +31,7 @@ #include "components/password_manager/core/browser/password_manager.h" #include "components/password_manager/core/browser/password_manager_client.h" #include "components/password_manager/core/browser/password_manager_driver.h" +#include "components/password_manager/core/common/password_manager_features.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/browser/navigation_handle.h" @@ -387,9 +388,15 @@ } std::u16string PasswordGenerationPopupControllerImpl::SuggestedText() { - return l10n_util::GetStringUTF16( - state_ == kOfferGeneration ? IDS_PASSWORD_GENERATION_SUGGESTION - : IDS_PASSWORD_GENERATION_EDITING_SUGGESTION); + if (state_ == kOfferGeneration) { + return l10n_util::GetStringUTF16( + base::FeatureList::IsEnabled( + password_manager::features::kUnifiedPasswordManagerDesktop) + ? IDS_PASSWORD_GENERATION_SUGGESTION_GPM + : IDS_PASSWORD_GENERATION_SUGGESTION); + } + + return l10n_util::GetStringUTF16(IDS_PASSWORD_GENERATION_EDITING_SUGGESTION); } const std::u16string& PasswordGenerationPopupControllerImpl::HelpText() {
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc index cb633e1f..10c2f1c 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -368,20 +368,13 @@ #if !BUILDFLAG(IS_CHROMEOS_ASH) void ProfileMenuView::OnSigninButtonClicked() { RecordClick(ActionableItem::kSigninButton); -#if BUILDFLAG(IS_CHROMEOS_LACROS) - signin_ui_util::ShowSigninPromptAndMaybeEnableSync( - browser(), browser()->profile(), /*enable_sync=*/true, - signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN, - signin_metrics::PromoAction:: - PROMO_ACTION_NEW_ACCOUNT_NO_EXISTING_ACCOUNT); -#else if (!perform_menu_actions()) return; Hide(); - browser()->signin_view_controller()->ShowSignin( - profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN, + + signin_ui_util::EnableSyncFromSingleAccountPromo( + browser(), AccountInfo(), signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); -#endif } void ProfileMenuView::OnOtherProfileSelected(
diff --git a/chrome/browser/ui/views/side_panel/side_panel_registry.cc b/chrome/browser/ui/views/side_panel/side_panel_registry.cc index 0da7638..73f3650 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_registry.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_registry.cc
@@ -58,28 +58,30 @@ observers_.RemoveObserver(observer); } -void SidePanelRegistry::Register(std::unique_ptr<SidePanelEntry> entry) { +bool SidePanelRegistry::Register(std::unique_ptr<SidePanelEntry> entry) { + if (GetEntryForId(entry->id())) + return false; for (SidePanelRegistryObserver& observer : observers_) observer.OnEntryRegistered(entry.get()); entry->AddObserver(this); entries_.push_back(std::move(entry)); + return true; } -void SidePanelRegistry::Deregister(SidePanelEntry::Id id) { - for (auto const& entry : entries_) { - if (entry.get()->id() == id) { - entry.get()->RemoveObserver(this); - if (active_entry_.has_value() && - entry.get()->id() == active_entry_.value()->id()) { - active_entry_.reset(); - } - for (SidePanelRegistryObserver& observer : observers_) { - observer.OnEntryWillDeregister(entry.get()); - } - RemoveEntry(entry.get()); - return; - } +bool SidePanelRegistry::Deregister(SidePanelEntry::Id id) { + auto* entry = GetEntryForId(id); + if (!entry) + return false; + + entry->RemoveObserver(this); + if (active_entry_.has_value() && entry->id() == active_entry_.value()->id()) { + active_entry_.reset(); } + for (SidePanelRegistryObserver& observer : observers_) { + observer.OnEntryWillDeregister(entry); + } + RemoveEntry(entry); + return true; } void SidePanelRegistry::OnEntryShown(SidePanelEntry* entry) {
diff --git a/chrome/browser/ui/views/side_panel/side_panel_registry.h b/chrome/browser/ui/views/side_panel/side_panel_registry.h index 1891606..a2b18db 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_registry.h +++ b/chrome/browser/ui/views/side_panel/side_panel_registry.h
@@ -42,8 +42,13 @@ void AddObserver(SidePanelRegistryObserver* observer); void RemoveObserver(SidePanelRegistryObserver* observer); - void Register(std::unique_ptr<SidePanelEntry> entry); - void Deregister(SidePanelEntry::Id id); + // Registers a SidePanelEntry. Returns true if the entry is successfully + // registered and false if a SidePanelEntry already exists in the registry for + // the provided SidePanelEntry::Id. + bool Register(std::unique_ptr<SidePanelEntry> entry); + // Deregisters the entry for the given SidePanelEntry::Id. Returns true if + // successful and false if there is no entry registered for the |id|. + bool Deregister(SidePanelEntry::Id id); absl::optional<SidePanelEntry*> active_entry() { return active_entry_; } std::vector<std::unique_ptr<SidePanelEntry>>& entries() { return entries_; }
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc index b2dbcac..077401f 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc
@@ -420,6 +420,13 @@ thumbnail_observer_->Observe(nullptr); thumbnail_wait_state_ = ThumbnailWaitState::kNotWaiting; } + + // Cancel any pending fade-in. + if (fade_animator_->IsFadingIn()) { + fade_animator_->CancelFadeIn(); + metrics_->CardFadeCanceled(); + } + // This needs to be called whether we're doing a fade or a pop out. metrics_->CardWillBeHidden(); slide_animator_->StopAnimation();
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_metrics.cc b/chrome/browser/ui/views/tabs/tab_hover_card_metrics.cc index 0fa1ba8..3a0a6f7 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_metrics.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_metrics.cc
@@ -183,8 +183,7 @@ void TabHoverCardMetrics::CardFadeCanceled() { #if BUILDFLAG(IS_CHROMEOS_ASH) - if (throughput_tracker_.has_value()) - throughput_tracker_->Cancel(); + throughput_tracker_.reset(); #endif }
diff --git a/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc index f26350d..c0af736e 100644 --- a/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc
@@ -105,12 +105,8 @@ void AppLaunchSplashScreenHandler::RegisterMessages() { AddCallback("configureNetwork", &AppLaunchSplashScreenHandler::HandleConfigureNetwork); - AddCallback("cancelAppLaunch", - &AppLaunchSplashScreenHandler::HandleCancelAppLaunch); AddCallback("continueAppLaunch", &AppLaunchSplashScreenHandler::HandleContinueAppLaunch); - AddCallback("networkConfigRequest", - &AppLaunchSplashScreenHandler::HandleNetworkConfigRequested); } void AppLaunchSplashScreenHandler::Hide() { @@ -281,19 +277,6 @@ LOG(WARNING) << "No delegate set to handle network configuration."; } -void AppLaunchSplashScreenHandler::HandleCancelAppLaunch() { - if (delegate_) - delegate_->OnCancelAppLaunch(); - else - LOG(WARNING) << "No delegate set to handle cancel app launch"; -} - -void AppLaunchSplashScreenHandler::HandleNetworkConfigRequested() { - if (!delegate_) - return; - delegate_->OnNetworkConfigRequested(); -} - void AppLaunchSplashScreenHandler::HandleContinueAppLaunch() { if (!delegate_) return;
diff --git a/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h index c2783ed..86f68752 100644 --- a/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h
@@ -25,12 +25,6 @@ // Invoked when the configure network control is clicked. virtual void OnConfigureNetwork() {} - // Invoked when the app launch bailout shortcut key is pressed. - virtual void OnCancelAppLaunch() {} - - // Invoked when the network config shortcut key is pressed. - virtual void OnNetworkConfigRequested() {} - // Invoked when the network config did prepare network and is closed. virtual void OnNetworkConfigFinished() {} @@ -133,9 +127,7 @@ void SetLaunchText(const std::string& text); int GetProgressMessageFromState(AppLaunchState state); void HandleConfigureNetwork(); - void HandleCancelAppLaunch(); void HandleContinueAppLaunch(); - void HandleNetworkConfigRequested(); void DoToggleNetworkConfig(bool visible); Delegate* delegate_ = nullptr;
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index 162315f..0f56cd3 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -1169,15 +1169,9 @@ } } - if (gaia_silent_load_ && !populated_account_id_.is_valid()) { - dns_cleared_ = true; - cookies_cleared_ = true; - ShowGaiaScreenIfReady(); - } else { - StartClearingDnsCache(); - StartClearingCookies(base::BindOnce( - &GaiaScreenHandler::ShowGaiaScreenIfReady, weak_factory_.GetWeakPtr())); - } + StartClearingDnsCache(); + StartClearingCookies(base::BindOnce(&GaiaScreenHandler::ShowGaiaScreenIfReady, + weak_factory_.GetWeakPtr())); } void GaiaScreenHandler::ShowSigninScreenForTest(const std::string& username, @@ -1285,13 +1279,6 @@ } std::string active_network_path = network_state_informer_->network_path(); - if (gaia_silent_load_ && - (network_state_informer_->state() != NetworkStateInformer::ONLINE || - gaia_silent_load_network_ != active_network_path)) { - // Network has changed. Force Gaia reload. - gaia_silent_load_ = false; - } - if (!untrusted_authority_certs_cache_) { // Make additional untrusted authority certificates available for client // certificate discovery in case a SAML flow is used which requires a client @@ -1307,13 +1294,8 @@ chromeos::onc::CertificateScope::Default())); } - LoadAuthExtension(!gaia_silent_load_ /* force */); + LoadAuthExtension(/* force=*/true); - if (gaia_silent_load_) { - // The variable is assigned to false because silently loaded Gaia page was - // used. - gaia_silent_load_ = false; - } UpdateState(NetworkError::ERROR_REASON_UPDATE); // TODO(crbug.com/1105387): Part of initial screen logic.
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h index f69d84c..249c9fef 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -346,12 +346,6 @@ // clean-up finish, and the handler is initialized (i.e. the web UI is ready). bool show_when_ready_ = false; - // Has Gaia page silent load been started for the current sign-in attempt? - bool gaia_silent_load_ = false; - - // The active network at the moment when Gaia page was preloaded. - std::string gaia_silent_load_network_; - // This flag is set when user authenticated using the Chrome Credentials // Passing API (the login could happen via SAML or, with the current // server-side implementation, via Gaia).
diff --git a/chrome/browser/ui/webui/history/history_login_handler.cc b/chrome/browser/ui/webui/history/history_login_handler.cc index fe638ce..6cc94ef 100644 --- a/chrome/browser/ui/webui/history/history_login_handler.cc +++ b/chrome/browser/ui/webui/history/history_login_handler.cc
@@ -9,11 +9,13 @@ #include "base/callback_helpers.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/signin/signin_ui_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" -#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/webui/profile_info_watcher.h" #include "components/signin/public/base/signin_metrics.h" +#include "components/signin/public/identity_manager/identity_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" @@ -63,7 +65,9 @@ const base::ListValue* /*args*/) { Browser* browser = chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()); - browser->window()->ShowAvatarBubbleFromAvatarButton( - BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN, - signin_metrics::AccessPoint::ACCESS_POINT_RECENT_TABS, false); + signin_ui_util::EnableSyncFromSingleAccountPromo( + browser, + IdentityManagerFactory::GetForProfile(browser->profile()) + ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin), + signin_metrics::AccessPoint::ACCESS_POINT_RECENT_TABS); }
diff --git a/chrome/browser/ui/webui/profile_internals/profile_internals_handler.cc b/chrome/browser/ui/webui/profile_internals/profile_internals_handler.cc index 0d51b88..2c8c7899 100644 --- a/chrome/browser/ui/webui/profile_internals/profile_internals_handler.cc +++ b/chrome/browser/ui/webui/profile_internals/profile_internals_handler.cc
@@ -73,7 +73,7 @@ std::vector<ProfileAttributesEntry*> entries = g_browser_process->profile_manager() ->GetProfileAttributesStorage() - .GetAllProfilesAttributesSortedByLocalProfilName(); + .GetAllProfilesAttributesSortedByLocalProfileName(); for (const ProfileAttributesEntry* entry : entries) { profiles_list.Append(CreateProfileEntry(entry)); }
diff --git a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc index f277c01..4c26ceb 100644 --- a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
@@ -143,6 +143,11 @@ return *this; } + AccountBuilder& SetIsManaged(const bool& value) { + account_.SetBoolKey("isManaged", value); + return *this; + } + AccountBuilder& SetPic(const std::string& value) { account_.SetStringKey("pic", value); return *this; @@ -307,16 +312,19 @@ std::string organization = kFamilyLink; // Replace space with the non-breaking space. base::ReplaceSubstringsAfterOffset(&organization, 0, " ", " "); - device_account.SetOrganization(organization); + device_account.SetOrganization(organization).SetIsManaged(true); } else if (user->IsActiveDirectoryUser()) { - device_account.SetOrganization( - chrome::enterprise_util::GetDomainFromEmail(user->GetDisplayEmail())); + device_account + .SetOrganization(chrome::enterprise_util::GetDomainFromEmail( + user->GetDisplayEmail())) + .SetIsManaged(true); } else if (profile_->GetProfilePolicyConnector()->IsManaged()) { - device_account.SetOrganization( - chrome::enterprise_util::GetDomainFromEmail( + device_account + .SetOrganization(chrome::enterprise_util::GetDomainFromEmail( identity_manager_ ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin) - .email)); + .email)) + .SetIsManaged(true); } // Device account must show up at the top. @@ -359,6 +367,7 @@ .SetFullName(maybe_account_info.full_name) .SetEmail(stored_account.raw_email) .SetUnmigrated(!is_child_user && account_token_pair.second) + .SetIsManaged(maybe_account_info.IsManaged()) .SetIsSignedIn(!identity_manager_ ->HasAccountWithRefreshTokenInPersistentErrorState( maybe_account_info.account_id));
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index 81ac54f..ccc7957 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -43,6 +43,7 @@ #include "components/signin/public/base/consent_level.h" #include "components/signin/public/base/signin_metrics.h" #include "components/signin/public/base/signin_pref_names.h" +#include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/accounts_mutator.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/primary_account_mutator.h" @@ -362,23 +363,11 @@ SigninErrorController* error_controller = SigninErrorControllerFactory::GetForProfile(browser->profile()); DCHECK(error_controller->HasError()); -#if BUILDFLAG(IS_CHROMEOS_LACROS) signin_ui_util::ShowReauthForPrimaryAccountWithAuthError(browser, access_point); -#else - browser->window()->ShowAvatarBubbleFromAvatarButton( - BrowserWindow::AVATAR_BUBBLE_MODE_REAUTH, access_point, false); -#endif // BUILDFLAG(IS_CHROMEOS_LACROS) } else { -#if BUILDFLAG(IS_CHROMEOS_LACROS) - signin_ui_util::ShowSigninPromptAndMaybeEnableSync( - browser, browser->profile(), /*enable_sync=*/true, access_point, - signin_metrics::PromoAction:: - PROMO_ACTION_NEW_ACCOUNT_NO_EXISTING_ACCOUNT); -#else - browser->window()->ShowAvatarBubbleFromAvatarButton( - BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN, access_point, false); -#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + signin_ui_util::EnableSyncFromSingleAccountPromo(browser, CoreAccountInfo(), + access_point); } } #endif // !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.cc b/chrome/browser/ui/webui/signin/profile_picker_handler.cc index 510c68f..312270b 100644 --- a/chrome/browser/ui/webui/signin/profile_picker_handler.cc +++ b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
@@ -1028,7 +1028,7 @@ std::vector<ProfileAttributesEntry*> ordered_entries = g_browser_process->profile_manager() ->GetProfileAttributesStorage() - .GetAllProfilesAttributesSortedByLocalProfilName(); + .GetAllProfilesAttributesSortedByLocalProfileName(); base::EraseIf(ordered_entries, [](const ProfileAttributesEntry* entry) { return entry->IsOmitted(); });
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 5b3a162..7df7df30 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1651643616-1e7371277884d77436834f7efca7246f78eaa0f5.profdata +chrome-linux-main-1651665578-9cb92b4092a730973fada578495002670831c018.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 5f80827..084fbfc 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1651643616-b81fec98f6d9b2ef7c34dd3363f7726fb1f3609d.profdata +chrome-mac-arm-main-1651665578-315a72a79b6e4d7c46547f08b7c9661e2aac22bc.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 1d107b2..1374f707 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1651643616-28b892b8b6d582c13a7d2a43a0d8949c2efac143.profdata +chrome-mac-main-1651665578-1a3b9a80baf841c3edd70fa372e2916b0abbdeaf.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 0c2b7e3b..2df243a 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1651643616-f383d55262d274bd70e87f1b1e79b5010746baa9.profdata +chrome-win32-main-1651665578-0edd33673d423ea1141702cb54f60f9794851667.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 82f5a4e5..9795e699 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1651643616-314c675216042dc8bbab40d83a71d60028c66683.profdata +chrome-win64-main-1651665578-f8f63fd67ac1e763cec5454499e27f1e69e42bbb.profdata
diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl index a037098..a3a717a 100644 --- a/chrome/common/extensions/api/file_manager_private.idl +++ b/chrome/common/extensions/api/file_manager_private.idl
@@ -1635,6 +1635,9 @@ // Creates a new Files app window in the directory provided in `params`. static void openWindow(OpenWindowParams params, BooleanCallback callback); + // Opens the feedback report window. + static void sendFeedback(); + // Starts an I/O task of type |type| on |entries|. Task type specific // parameters are passed via |params|. [nocompile]
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index df50769..4117b101 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -9543,6 +9543,8 @@ "../browser/sync/test/integration/sync_datatype_helper.h", "../browser/sync/test/integration/sync_disabled_checker.cc", "../browser/sync/test/integration/sync_disabled_checker.h", + "../browser/sync/test/integration/sync_engine_stopped_checker.cc", + "../browser/sync/test/integration/sync_engine_stopped_checker.h", "../browser/sync/test/integration/sync_service_impl_harness.cc", "../browser/sync/test/integration/sync_service_impl_harness.h", "../browser/sync/test/integration/sync_signin_delegate.cc", @@ -9772,6 +9774,7 @@ "../browser/sync/test/integration/single_client_arc_package_sync_test.cc", "../browser/sync/test/integration/single_client_os_preferences_sync_test.cc", "../browser/sync/test/integration/single_client_printers_sync_test.cc", + "../browser/sync/test/integration/single_client_wifi_configuration_sync_test.cc", "../browser/sync/test/integration/single_client_workspace_desk_sync_test.cc", "../browser/sync/test/integration/two_client_app_list_sync_test.cc", "../browser/sync/test/integration/two_client_arc_package_sync_test.cc", @@ -9779,6 +9782,9 @@ "../browser/sync/test/integration/two_client_printers_sync_test.cc", ] deps += [ + "//chromeos/components/sync_wifi", + "//chromeos/components/sync_wifi:test_support", + "//chromeos/dbus/shill", "//chromeos/printing", "//components/desks_storage", ]
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js index 5805516..e3ff7df 100644 --- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -470,7 +470,7 @@ devicePage = document.createElement('settings-device-page'); devicePage.prefs = getFakePrefs(); - DevicePageBrowserProxyImpl.setInstance(new TestDevicePageBrowserProxy()); + DevicePageBrowserProxyImpl.instance_ = new TestDevicePageBrowserProxy(); // settings-animated-pages expects a parent with data-page set. const basicPage = document.createElement('div'); @@ -484,11 +484,10 @@ /** @return {!Promise<!HTMLElement>} */ function showAndGetDeviceSubpage(subpage, expectedRoute) { - const row = - assert(devicePage.shadowRoot.querySelector(`#main #${subpage}Row`)); + const row = assert(devicePage.$$(`#main #${subpage}Row`)); row.click(); assertEquals(expectedRoute, Router.getInstance().getCurrentRoute()); - const page = devicePage.shadowRoot.querySelector('settings-' + subpage); + const page = devicePage.$$('settings-' + subpage); assert(page); return Promise.resolve(page); } @@ -621,7 +620,7 @@ */ function expectReverseScrollValue(pointersPage, expected) { const reverseScrollToggle = - pointersPage.shadowRoot.querySelector('#enableReverseScrollingToggle'); + pointersPage.$$('#enableReverseScrollingToggle'); assertEquals(expected, reverseScrollToggle.checked); assertEquals( expected, devicePage.prefs.settings.touchpad.natural_scroll.value); @@ -659,25 +658,18 @@ } test(assert(TestNames.DevicePage), function() { - assertTrue(isVisible(devicePage.shadowRoot.querySelector('#pointersRow'))); - assertTrue(isVisible(devicePage.shadowRoot.querySelector('#keyboardRow'))); - assertTrue(isVisible(devicePage.shadowRoot.querySelector('#displayRow'))); + assertTrue(isVisible(devicePage.$$('#pointersRow'))); + assertTrue(isVisible(devicePage.$$('#keyboardRow'))); + assertTrue(isVisible(devicePage.$$('#displayRow'))); webUIListenerCallback('has-mouse-changed', false); - flush(); - assertTrue(isVisible(devicePage.shadowRoot.querySelector('#pointersRow'))); - + assertTrue(isVisible(devicePage.$$('#pointersRow'))); webUIListenerCallback('has-pointing-stick-changed', false); - flush(); - assertTrue(isVisible(devicePage.shadowRoot.querySelector('#pointersRow'))); - + assertTrue(isVisible(devicePage.$$('#pointersRow'))); webUIListenerCallback('has-touchpad-changed', false); - flush(); - assertFalse(isVisible(devicePage.shadowRoot.querySelector('#pointersRow'))); - + assertFalse(isVisible(devicePage.$$('#pointersRow'))); webUIListenerCallback('has-mouse-changed', true); - flush(); - assertTrue(isVisible(devicePage.shadowRoot.querySelector('#pointersRow'))); + assertTrue(isVisible(devicePage.$$('#pointersRow'))); }); suite(assert(TestNames.Pointers), function() { @@ -692,90 +684,63 @@ test('subpage responds to pointer attach/detach', function() { assertEquals(routes.POINTERS, Router.getInstance().getCurrentRoute()); - assertTrue(isVisible(pointersPage.shadowRoot.querySelector('#mouse'))); - assertTrue(isVisible(pointersPage.shadowRoot.querySelector('#mouse h2'))); - assertTrue( - isVisible(pointersPage.shadowRoot.querySelector('#pointingStick'))); - assertTrue(isVisible( - pointersPage.shadowRoot.querySelector('#pointingStick h2'))); - assertTrue(isVisible(pointersPage.shadowRoot.querySelector('#touchpad'))); - assertTrue( - isVisible(pointersPage.shadowRoot.querySelector('#touchpad h2'))); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertTrue(isVisible(pointersPage.$$('#mouse h2'))); + assertTrue(isVisible(pointersPage.$$('#pointingStick'))); + assertTrue(isVisible(pointersPage.$$('#pointingStick h2'))); + assertTrue(isVisible(pointersPage.$$('#touchpad'))); + assertTrue(isVisible(pointersPage.$$('#touchpad h2'))); webUIListenerCallback('has-touchpad-changed', false); assertEquals(routes.POINTERS, Router.getInstance().getCurrentRoute()); - assertTrue(isVisible(pointersPage.shadowRoot.querySelector('#mouse'))); - assertTrue(isVisible(pointersPage.shadowRoot.querySelector('#mouse h2'))); - assertTrue( - isVisible(pointersPage.shadowRoot.querySelector('#pointingStick'))); - assertTrue(isVisible( - pointersPage.shadowRoot.querySelector('#pointingStick h2'))); - assertFalse( - isVisible(pointersPage.shadowRoot.querySelector('#touchpad'))); - assertFalse( - isVisible(pointersPage.shadowRoot.querySelector('#touchpad h2'))); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertTrue(isVisible(pointersPage.$$('#mouse h2'))); + assertTrue(isVisible(pointersPage.$$('#pointingStick'))); + assertTrue(isVisible(pointersPage.$$('#pointingStick h2'))); + assertFalse(isVisible(pointersPage.$$('#touchpad'))); + assertFalse(isVisible(pointersPage.$$('#touchpad h2'))); webUIListenerCallback('has-pointing-stick-changed', false); assertEquals(routes.POINTERS, Router.getInstance().getCurrentRoute()); - assertTrue(isVisible(pointersPage.shadowRoot.querySelector('#mouse'))); - assertFalse( - isVisible(pointersPage.shadowRoot.querySelector('#mouse h2'))); - assertFalse( - isVisible(pointersPage.shadowRoot.querySelector('#pointingStick'))); - assertFalse(isVisible( - pointersPage.shadowRoot.querySelector('#pointingStick h2'))); - assertFalse( - isVisible(pointersPage.shadowRoot.querySelector('#touchpad'))); - assertFalse( - isVisible(pointersPage.shadowRoot.querySelector('#touchpad h2'))); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertFalse(isVisible(pointersPage.$$('#mouse h2'))); + assertFalse(isVisible(pointersPage.$$('#pointingStick'))); + assertFalse(isVisible(pointersPage.$$('#pointingStick h2'))); + assertFalse(isVisible(pointersPage.$$('#touchpad'))); + assertFalse(isVisible(pointersPage.$$('#touchpad h2'))); webUIListenerCallback('has-mouse-changed', false); assertEquals(routes.DEVICE, Router.getInstance().getCurrentRoute()); - assertFalse( - isVisible(devicePage.shadowRoot.querySelector('#main #pointersRow'))); + assertFalse(isVisible(devicePage.$$('#main #pointersRow'))); webUIListenerCallback('has-touchpad-changed', true); - assertTrue( - isVisible(devicePage.shadowRoot.querySelector('#main #pointersRow'))); + assertTrue(isVisible(devicePage.$$('#main #pointersRow'))); return showAndGetDeviceSubpage('pointers', routes.POINTERS) .then(function(page) { - assertFalse( - isVisible(pointersPage.shadowRoot.querySelector('#mouse'))); - assertFalse( - isVisible(pointersPage.shadowRoot.querySelector('#mouse h2'))); - assertFalse(isVisible( - pointersPage.shadowRoot.querySelector('#pointingStick'))); - assertFalse(isVisible( - pointersPage.shadowRoot.querySelector('#pointingStick h2'))); - assertTrue( - isVisible(pointersPage.shadowRoot.querySelector('#touchpad'))); - assertFalse(isVisible( - pointersPage.shadowRoot.querySelector('#touchpad h2'))); + assertFalse(isVisible(pointersPage.$$('#mouse'))); + assertFalse(isVisible(pointersPage.$$('#mouse h2'))); + assertFalse(isVisible(pointersPage.$$('#pointingStick'))); + assertFalse(isVisible(pointersPage.$$('#pointingStick h2'))); + assertTrue(isVisible(pointersPage.$$('#touchpad'))); + assertFalse(isVisible(pointersPage.$$('#touchpad h2'))); webUIListenerCallback('has-mouse-changed', true); assertEquals( routes.POINTERS, Router.getInstance().getCurrentRoute()); - assertTrue( - isVisible(pointersPage.shadowRoot.querySelector('#mouse'))); - assertTrue( - isVisible(pointersPage.shadowRoot.querySelector('#mouse h2'))); - assertFalse(isVisible( - pointersPage.shadowRoot.querySelector('#pointingStick'))); - assertFalse(isVisible( - pointersPage.shadowRoot.querySelector('#pointingStick h2'))); - assertTrue( - isVisible(pointersPage.shadowRoot.querySelector('#touchpad'))); - assertTrue(isVisible( - pointersPage.shadowRoot.querySelector('#touchpad h2'))); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertTrue(isVisible(pointersPage.$$('#mouse h2'))); + assertFalse(isVisible(pointersPage.$$('#pointingStick'))); + assertFalse(isVisible(pointersPage.$$('#pointingStick h2'))); + assertTrue(isVisible(pointersPage.$$('#touchpad'))); + assertTrue(isVisible(pointersPage.$$('#touchpad h2'))); }); }); test('mouse', function() { - assertTrue(isVisible(pointersPage.shadowRoot.querySelector('#mouse'))); + assertTrue(isVisible(pointersPage.$$('#mouse'))); - const slider = assert( - pointersPage.shadowRoot.querySelector('#mouse settings-slider')); + const slider = assert(pointersPage.$$('#mouse settings-slider')); assertEquals(4, slider.pref.value); MockInteractions.pressAndReleaseKeyOn( slider.shadowRoot.querySelector('cr-slider'), 37, [], 'ArrowLeft'); @@ -786,17 +751,12 @@ }); test('touchpad', function() { - assertTrue(isVisible(pointersPage.shadowRoot.querySelector('#touchpad'))); + assertTrue(isVisible(pointersPage.$$('#touchpad'))); - assertTrue( - pointersPage.shadowRoot.querySelector('#touchpad #enableTapToClick') - .checked); - assertFalse( - pointersPage.shadowRoot.querySelector('#touchpad #enableTapDragging') - .checked); + assertTrue(pointersPage.$$('#touchpad #enableTapToClick').checked); + assertFalse(pointersPage.$$('#touchpad #enableTapDragging').checked); - const slider = assert( - pointersPage.shadowRoot.querySelector('#touchpad settings-slider')); + const slider = assert(pointersPage.$$('#touchpad settings-slider')); assertEquals(3, slider.pref.value); MockInteractions.pressAndReleaseKeyOn( slider.shadowRoot.querySelector('cr-slider'), 39 /* right */, [], @@ -808,12 +768,9 @@ }); test('haptic touchpad', function() { - assertTrue( - pointersPage.shadowRoot.querySelector('#touchpadHapticFeedbackToggle') - .checked); + assertTrue(pointersPage.$$('#touchpadHapticFeedbackToggle').checked); - const slider = assert(pointersPage.shadowRoot.querySelector( - '#touchpadHapticClickSensitivity')); + const slider = assert(pointersPage.$$('#touchpadHapticClickSensitivity')); assertEquals(3, slider.pref.value); MockInteractions.pressAndReleaseKeyOn( slider.shadowRoot.querySelector('cr-slider'), 39 /* right */, [], @@ -831,7 +788,7 @@ // Tapping the link shouldn't enable the radio button. const reverseScrollLabel = - pointersPage.shadowRoot.querySelector('#enableReverseScrollingLabel'); + pointersPage.$$('#enableReverseScrollingLabel'); const a = reverseScrollLabel.$.container.querySelector('a'); assertTrue(!!a); // Prevent actually opening a link, which would block test. @@ -840,16 +797,15 @@ expectReverseScrollValue(pointersPage, false); // Check specifically clicking toggle changes pref. - const reverseScrollToggle = pointersPage.shadowRoot.querySelector( - '#enableReverseScrollingToggle'); + const reverseScrollToggle = + pointersPage.$$('#enableReverseScrollingToggle'); reverseScrollToggle.click(); expectReverseScrollValue(pointersPage, true); devicePage.set('prefs.settings.touchpad.natural_scroll.value', false); expectReverseScrollValue(pointersPage, false); // Check specifically clicking the row changes pref. - const reverseScrollSettings = - pointersPage.shadowRoot.querySelector('#reverseScrollRow'); + const reverseScrollSettings = pointersPage.$$('#reverseScrollRow'); reverseScrollSettings.click(); expectReverseScrollValue(pointersPage, true); devicePage.set('prefs.settings.touchpad.natural_scroll.value', false); @@ -857,8 +813,7 @@ }); test('pointing stick acceleration toggle', function() { - const toggle = assert( - pointersPage.shadowRoot.querySelector('#pointingStickAcceleration')); + const toggle = assert(pointersPage.$$('#pointingStickAcceleration')); assertEquals(true, toggle.pref.value); toggle.click(); assertEquals( @@ -870,8 +825,7 @@ }); test('pointing stick speed slider', function() { - const slider = assert(pointersPage.shadowRoot.querySelector( - '#pointingStick settings-slider')); + const slider = assert(pointersPage.$$('#pointingStick settings-slider')); assertEquals(4, slider.pref.value); MockInteractions.pressAndReleaseKeyOn( slider.shadowRoot.querySelector('cr-slider'), 37, [], 'ArrowLeft'); @@ -885,8 +839,7 @@ test('Deep link to pointing stick primary button setting', async () => { return checkDeepLink( routes.POINTERS, '437', - pointersPage.shadowRoot - .querySelector('#pointingStickSwapButtonDropdown') + pointersPage.$$('#pointingStickSwapButtonDropdown') .shadowRoot.querySelector('select'), 'Pointing stick primary button dropdown'); }); @@ -894,7 +847,7 @@ test('Deep link to pointing stick acceleration setting', async () => { return checkDeepLink( routes.POINTERS, '436', - pointersPage.shadowRoot.querySelector('#pointingStickAcceleration') + pointersPage.$$('#pointingStickAcceleration') .shadowRoot.querySelector('cr-toggle'), 'Pointing stick acceleration slider'); }); @@ -902,7 +855,7 @@ test('Deep link to pointing stick speed setting', async () => { return checkDeepLink( routes.POINTERS, '435', - pointersPage.shadowRoot.querySelector('#pointingStickSpeedSlider') + pointersPage.$$('#pointingStickSpeedSlider') .shadowRoot.querySelector('cr-slider'), 'Pointing stick speed slider'); }); @@ -910,7 +863,7 @@ test('Deep link to touchpad speed', async () => { return checkDeepLink( routes.POINTERS, '405', - pointersPage.shadowRoot.querySelector('#touchpadSensitivity') + pointersPage.$$('#touchpadSensitivity') .shadowRoot.querySelector('cr-slider'), 'Touchpad speed slider'); }); @@ -928,7 +881,7 @@ test('keyboard', async () => { // Initially, the optional keys are hidden. - assertFalse(!!keyboardPage.shadowRoot.querySelector('#capsLockKey')); + assertFalse(!!keyboardPage.$$('#capsLockKey')); // Pretend no internal keyboard is available. const keyboardParams = { @@ -940,87 +893,75 @@ }; webUIListenerCallback('show-keys-changed', keyboardParams); flush(); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#launcherKey')); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#capsLockKey')); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#externalMetaKey')); - assertFalse( - !!keyboardPage.shadowRoot.querySelector('#externalCommandKey')); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#assistantKey')); + assertFalse(!!keyboardPage.$$('#launcherKey')); + assertFalse(!!keyboardPage.$$('#capsLockKey')); + assertFalse(!!keyboardPage.$$('#externalMetaKey')); + assertFalse(!!keyboardPage.$$('#externalCommandKey')); + assertFalse(!!keyboardPage.$$('#assistantKey')); // Pretend a Caps Lock key is now available. keyboardParams['showCapsLock'] = true; webUIListenerCallback('show-keys-changed', keyboardParams); flush(); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#launcherKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#capsLockKey')); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#externalMetaKey')); - assertFalse( - !!keyboardPage.shadowRoot.querySelector('#externalCommandKey')); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#assistantKey')); + assertFalse(!!keyboardPage.$$('#launcherKey')); + assertTrue(!!keyboardPage.$$('#capsLockKey')); + assertFalse(!!keyboardPage.$$('#externalMetaKey')); + assertFalse(!!keyboardPage.$$('#externalCommandKey')); + assertFalse(!!keyboardPage.$$('#assistantKey')); // Add a non-Apple external keyboard. keyboardParams['showExternalMetaKey'] = true; webUIListenerCallback('show-keys-changed', keyboardParams); flush(); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#launcherKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#capsLockKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#externalMetaKey')); - assertFalse( - !!keyboardPage.shadowRoot.querySelector('#externalCommandKey')); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#assistantKey')); + assertFalse(!!keyboardPage.$$('#launcherKey')); + assertTrue(!!keyboardPage.$$('#capsLockKey')); + assertTrue(!!keyboardPage.$$('#externalMetaKey')); + assertFalse(!!keyboardPage.$$('#externalCommandKey')); + assertFalse(!!keyboardPage.$$('#assistantKey')); // Add an Apple keyboard. keyboardParams['showAppleCommandKey'] = true; webUIListenerCallback('show-keys-changed', keyboardParams); flush(); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#launcherKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#capsLockKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#externalMetaKey')); - assertTrue( - !!keyboardPage.shadowRoot.querySelector('#externalCommandKey')); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#assistantKey')); + assertFalse(!!keyboardPage.$$('#launcherKey')); + assertTrue(!!keyboardPage.$$('#capsLockKey')); + assertTrue(!!keyboardPage.$$('#externalMetaKey')); + assertTrue(!!keyboardPage.$$('#externalCommandKey')); + assertFalse(!!keyboardPage.$$('#assistantKey')); // Add an internal keyboard. keyboardParams['hasLauncherKey'] = true; webUIListenerCallback('show-keys-changed', keyboardParams); flush(); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#launcherKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#capsLockKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#externalMetaKey')); - assertTrue( - !!keyboardPage.shadowRoot.querySelector('#externalCommandKey')); - assertFalse(!!keyboardPage.shadowRoot.querySelector('#assistantKey')); + assertTrue(!!keyboardPage.$$('#launcherKey')); + assertTrue(!!keyboardPage.$$('#capsLockKey')); + assertTrue(!!keyboardPage.$$('#externalMetaKey')); + assertTrue(!!keyboardPage.$$('#externalCommandKey')); + assertFalse(!!keyboardPage.$$('#assistantKey')); // Pretend an Assistant key is now available. keyboardParams['hasAssistantKey'] = true; webUIListenerCallback('show-keys-changed', keyboardParams); flush(); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#launcherKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#capsLockKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#externalMetaKey')); - assertTrue( - !!keyboardPage.shadowRoot.querySelector('#externalCommandKey')); - assertTrue(!!keyboardPage.shadowRoot.querySelector('#assistantKey')); + assertTrue(!!keyboardPage.$$('#launcherKey')); + assertTrue(!!keyboardPage.$$('#capsLockKey')); + assertTrue(!!keyboardPage.$$('#externalMetaKey')); + assertTrue(!!keyboardPage.$$('#externalCommandKey')); + assertTrue(!!keyboardPage.$$('#assistantKey')); - const collapse = keyboardPage.shadowRoot.querySelector('iron-collapse'); + const collapse = keyboardPage.$$('iron-collapse'); assertTrue(!!collapse); assertTrue(collapse.opened); - assertEquals( - 500, - keyboardPage.shadowRoot.querySelector('#delaySlider').pref.value); - assertEquals( - 500, - keyboardPage.shadowRoot.querySelector('#repeatRateSlider') - .pref.value); + assertEquals(500, keyboardPage.$$('#delaySlider').pref.value); + assertEquals(500, keyboardPage.$$('#repeatRateSlider').pref.value); // Test interaction with the settings-slider's underlying cr-slider. MockInteractions.pressAndReleaseKeyOn( - keyboardPage.shadowRoot.querySelector('#delaySlider') - .shadowRoot.querySelector('cr-slider'), + keyboardPage.$$('#delaySlider').shadowRoot.querySelector('cr-slider'), 37 /* left */, [], 'ArrowLeft'); MockInteractions.pressAndReleaseKeyOn( - keyboardPage.shadowRoot.querySelector('#repeatRateSlider') + keyboardPage.$$('#repeatRateSlider') .shadowRoot.querySelector('cr-slider'), 39, [], 'ArrowRight'); await flushTasks(); @@ -1030,34 +971,24 @@ // Test sliders change when prefs change. set('xkb_auto_repeat_delay_r2', 1500); await flushTasks(); - assertEquals( - 1500, - keyboardPage.shadowRoot.querySelector('#delaySlider').pref.value); + assertEquals(1500, keyboardPage.$$('#delaySlider').pref.value); set('xkb_auto_repeat_interval_r2', 2000); await flushTasks(); - assertEquals( - 2000, - keyboardPage.shadowRoot.querySelector('#repeatRateSlider') - .pref.value); + assertEquals(2000, keyboardPage.$$('#repeatRateSlider').pref.value); // Test sliders round to nearest value when prefs change. set('xkb_auto_repeat_delay_r2', 600); await flushTasks(); - assertEquals( - 500, - keyboardPage.shadowRoot.querySelector('#delaySlider').pref.value); + assertEquals(500, keyboardPage.$$('#delaySlider').pref.value); set('xkb_auto_repeat_interval_r2', 45); await flushTasks(); - assertEquals( - 50, - keyboardPage.shadowRoot.querySelector('#repeatRateSlider') - .pref.value); + assertEquals(50, keyboardPage.$$('#repeatRateSlider').pref.value); set('xkb_auto_repeat_enabled_r2', false); assertFalse(collapse.opened); // Test keyboard shortcut viewer button. - keyboardPage.shadowRoot.querySelector('#keyboardShortcutViewer').click(); + keyboardPage.$$('#keyboardShortcutViewer').click(); assertEquals( 1, DevicePageBrowserProxyImpl.getInstance() @@ -1067,7 +998,7 @@ test('Deep link to keyboard shortcuts', async () => { return checkDeepLink( routes.KEYBOARD, '413', - keyboardPage.shadowRoot.querySelector('#keyboardShortcutViewer') + keyboardPage.$$('#keyboardShortcutViewer') .shadowRoot.querySelector('cr-icon-button'), 'Keyboard shortcuts button'); }); @@ -1134,9 +1065,7 @@ false, displayPage.displays[0])); // Verify that the arrangement section is not shown. - assertEquals( - null, - displayPage.shadowRoot.querySelector('#arrangement-section')); + assertEquals(null, displayPage.$$('#arrangement-section')); // Add a second display. addDisplay(2); @@ -1201,16 +1130,13 @@ false, displayPage.displays[1])); // Verify that the arrangement section is shown. - assertTrue( - !!displayPage.shadowRoot.querySelector('#arrangement-section')); + assertTrue(!!displayPage.$$('#arrangement-section')); // Select the second display and make it primary. Also change the // orientation of the second display. - const displayLayout = - displayPage.shadowRoot.querySelector('#displayLayout'); + const displayLayout = displayPage.$$('#displayLayout'); assertTrue(!!displayLayout); - const displayDiv = - displayLayout.shadowRoot.querySelector('#_fakeDisplayId2'); + const displayDiv = displayLayout.$$('#_fakeDisplayId2'); assertTrue(!!displayDiv); displayDiv.click(); assertEquals( @@ -1262,8 +1188,7 @@ assertTrue(displayPage.isMirrored_(displayPage.displays)); // Verify that the arrangement section is shown while mirroring. - assertTrue( - !!displayPage.shadowRoot.querySelector('#arrangement-section')); + assertTrue(!!displayPage.$$('#arrangement-section')); // Ensure that the zoom value remains unchanged while draggging. function pointerEvent(eventType, ratio) { @@ -1319,8 +1244,7 @@ assertTrue(displayPage.shouldShowArrangementSection_()); const deepLinkElement = - displayPage.shadowRoot.querySelector('#displayMirrorCheckbox') - .$$('#checkbox'); + displayPage.$$('#displayMirrorCheckbox').$$('#checkbox'); await waitAfterNextRender(deepLinkElement); assertEquals( deepLinkElement, getDeepActiveElement(), @@ -1345,8 +1269,7 @@ assertEquals(2, displayPage.displays.length); assertTrue(displayPage.shouldShowArrangementSection_()); - assertTrue(!!displayPage.shadowRoot.querySelector( - '#arrangement-section')); + assertTrue(!!displayPage.$$('#arrangement-section')); assertTrue(displayPage.showMirror_(false, displayPage.displays)); assertFalse(displayPage.isMirrored_(displayPage.displays)); @@ -1357,10 +1280,8 @@ }); }) .then(() => { - const displayLayout = - displayPage.shadowRoot.querySelector('#displayLayout'); - const display = - displayLayout.shadowRoot.querySelector('#_fakeDisplayId2'); + const displayLayout = displayPage.$$('#displayLayout'); + const display = displayLayout.$$('#_fakeDisplayId2'); const layout = displayLayout.displayLayoutMap_.get('fakeDisplayId2'); @@ -1404,10 +1325,8 @@ await fakeSystemDisplay.getLayoutCalled.promise; assertEquals(1, displayPage.displays.length); - const temperature = - displayPage.shadowRoot.querySelector('#nightLightTemperatureDiv'); - const schedule = - displayPage.shadowRoot.querySelector('#nightLightScheduleTypeDropDown'); + const temperature = displayPage.$$('#nightLightTemperatureDiv'); + const schedule = displayPage.$$('#nightLightScheduleTypeDropDown'); // Night Light is off, so temperature is hidden. Schedule is always shown. assertTrue(temperature.hidden); @@ -1460,20 +1379,16 @@ return showAndGetDeviceSubpage('power', routes.POWER) .then(function(page) { powerPage = page; - powerSourceRow = - assert(powerPage.shadowRoot.querySelector('#powerSourceRow')); - powerSourceSelect = - assert(powerPage.shadowRoot.querySelector('#powerSource')); + powerSourceRow = assert(powerPage.$$('#powerSourceRow')); + powerSourceSelect = assert(powerPage.$$('#powerSource')); assertEquals( 1, DevicePageBrowserProxyImpl.getInstance() .updatePowerStatusCalled_); - lidClosedToggle = assert( - powerPage.shadowRoot.querySelector('#lidClosedToggle')); + lidClosedToggle = assert(powerPage.$$('#lidClosedToggle')); adaptiveChargingToggle = - assert(powerPage.shadowRoot.querySelector( - '#adaptiveChargingToggle')); + assert(powerPage.$$('#adaptiveChargingToggle')); assertEquals( 1, @@ -1512,13 +1427,10 @@ assertTrue(powerSourceRow.hidden); // Idle settings while on battery and while charging should not be // visible if the battery is not present. - assertEquals( - null, powerPage.shadowRoot.querySelector('#batteryIdleSettingBox')); - assertEquals( - null, powerPage.shadowRoot.querySelector('#acIdleSettingBox')); + assertEquals(null, powerPage.$$('#batteryIdleSettingBox')); + assertEquals(null, powerPage.$$('#acIdleSettingBox')); - const acIdleSelect = assert( - powerPage.shadowRoot.querySelector('#noBatteryAcIdleSelect')); + const acIdleSelect = assert(powerPage.$$('#noBatteryAcIdleSelect')); // Expect the "When idle" dropdown options to appear instead. assert(acIdleSelect); @@ -1614,8 +1526,7 @@ setPowerSources([], '', false); flush(); - acIdleSelect = - assert(powerPage.shadowRoot.querySelector('#acIdleSelect')); + acIdleSelect = assert(powerPage.$$('#acIdleSelect')); selectValue(acIdleSelect, IdleBehavior.DISPLAY_ON); assertEquals( IdleBehavior.DISPLAY_ON, @@ -1639,8 +1550,8 @@ powerPage.async(resolve); }) .then(function() { - const batteryIdleSelect = assert( - powerPage.shadowRoot.querySelector('#batteryIdleSelect')); + const batteryIdleSelect = + assert(powerPage.$$('#batteryIdleSelect')); selectValue(batteryIdleSelect, IdleBehavior.DISPLAY_ON); assertEquals( IdleBehavior.DISPLAY_ON, @@ -1727,13 +1638,12 @@ }); }) .then(function() { - const batteryIdleSelect = assert( - powerPage.shadowRoot.querySelector('#batteryIdleSelect')); + const batteryIdleSelect = + assert(powerPage.$$('#batteryIdleSelect')); assertEquals( IdleBehavior.SHUT_DOWN.toString(), batteryIdleSelect.value); assertFalse(batteryIdleSelect.disabled); - const acIdleSelect = - assert(powerPage.shadowRoot.querySelector('#acIdleSelect')); + const acIdleSelect = assert(powerPage.$$('#acIdleSelect')); assertEquals( IdleBehavior.SHUT_DOWN.toString(), acIdleSelect.value); assertFalse(acIdleSelect.disabled); @@ -1768,13 +1678,12 @@ }); }) .then(function() { - const batteryIdleSelect = assert( - powerPage.shadowRoot.querySelector('#batteryIdleSelect')); + const batteryIdleSelect = + assert(powerPage.$$('#batteryIdleSelect')); assertEquals( IdleBehavior.SHUT_DOWN.toString(), batteryIdleSelect.value); assertFalse(batteryIdleSelect.disabled); - const acIdleSelect = - assert(powerPage.shadowRoot.querySelector('#acIdleSelect')); + const acIdleSelect = assert(powerPage.$$('#acIdleSelect')); assertEquals( IdleBehavior.SHUT_DOWN.toString(), acIdleSelect.value); assertFalse(acIdleSelect.disabled); @@ -1823,19 +1732,15 @@ }); }) .then(function() { - acIdleSelect = - assert(powerPage.shadowRoot.querySelector('#acIdleSelect')); - const batteryIdleSelect = assert( - powerPage.shadowRoot.querySelector('#batteryIdleSelect')); + acIdleSelect = assert(powerPage.$$('#acIdleSelect')); + const batteryIdleSelect = + assert(powerPage.$$('#batteryIdleSelect')); assertEquals( IdleBehavior.DISPLAY_ON.toString(), acIdleSelect.value); assertEquals( IdleBehavior.DISPLAY_OFF.toString(), batteryIdleSelect.value); assertFalse(acIdleSelect.disabled); - assertEquals( - null, - powerPage.shadowRoot.querySelector( - '#acIdleManagedIndicator')); + assertEquals(null, powerPage.$$('#acIdleManagedIndicator')); assertEquals( loadTimeData.getString('powerLidSleepLabel'), lidClosedToggle.label); @@ -1861,22 +1766,16 @@ }); }) .then(function() { - const batteryIdleSelect = assert( - powerPage.shadowRoot.querySelector('#batteryIdleSelect')); + const batteryIdleSelect = + assert(powerPage.$$('#batteryIdleSelect')); assertEquals( IdleBehavior.DISPLAY_OFF.toString(), acIdleSelect.value); assertEquals( IdleBehavior.DISPLAY_ON.toString(), batteryIdleSelect.value); assertFalse(acIdleSelect.disabled); assertFalse(batteryIdleSelect.disabled); - assertEquals( - null, - powerPage.shadowRoot.querySelector( - '#acIdleManagedIndicator')); - assertEquals( - null, - powerPage.shadowRoot.querySelector( - '#batteryIdleManagedIndicator')); + assertEquals(null, powerPage.$$('#acIdleManagedIndicator')); + assertEquals(null, powerPage.$$('#batteryIdleManagedIndicator')); assertEquals( loadTimeData.getString('powerLidSleepLabel'), lidClosedToggle.label); @@ -1911,24 +1810,18 @@ powerPage.async(resolve); }) .then(function() { - acIdleSelect = - assert(powerPage.shadowRoot.querySelector('#acIdleSelect')); - const batteryIdleSelect = assert( - powerPage.shadowRoot.querySelector('#batteryIdleSelect')); + acIdleSelect = assert(powerPage.$$('#acIdleSelect')); + const batteryIdleSelect = + assert(powerPage.$$('#batteryIdleSelect')); assertEquals( IdleBehavior.SHUT_DOWN.toString(), acIdleSelect.value); assertEquals( IdleBehavior.SHUT_DOWN.toString(), batteryIdleSelect.value); assertTrue(acIdleSelect.disabled); assertTrue(batteryIdleSelect.disabled); + expectNotEquals(null, powerPage.$$('#acIdleManagedIndicator')); expectNotEquals( - null, - powerPage.shadowRoot.querySelector( - '#acIdleManagedIndicator')); - expectNotEquals( - null, - powerPage.shadowRoot.querySelector( - '#batteryIdleManagedIndicator')); + null, powerPage.$$('#batteryIdleManagedIndicator')); assertEquals( loadTimeData.getString('powerLidShutDownLabel'), lidClosedToggle.label); @@ -1948,22 +1841,16 @@ }); }) .then(function() { - const batteryIdleSelect = assert( - powerPage.shadowRoot.querySelector('#batteryIdleSelect')); + const batteryIdleSelect = + assert(powerPage.$$('#batteryIdleSelect')); assertEquals( IdleBehavior.DISPLAY_OFF.toString(), acIdleSelect.value); assertEquals( IdleBehavior.DISPLAY_OFF.toString(), batteryIdleSelect.value); assertTrue(acIdleSelect.disabled); assertTrue(batteryIdleSelect.disabled); - assertEquals( - null, - powerPage.shadowRoot.querySelector( - '#acIdleManagedIndicator')); - assertEquals( - null, - powerPage.shadowRoot.querySelector( - '#batteryIdleManagedIndicator')); + assertEquals(null, powerPage.$$('#acIdleManagedIndicator')); + assertEquals(null, powerPage.$$('#batteryIdleManagedIndicator')); assertEquals( loadTimeData.getString('powerLidSignOutLabel'), lidClosedToggle.label); @@ -1974,9 +1861,7 @@ test('hide lid behavior when lid not present', function() { return new Promise(function(resolve) { - assertFalse( - powerPage.shadowRoot.querySelector('#lidClosedToggle') - .hidden); + assertFalse(powerPage.$$('#lidClosedToggle').hidden); sendPowerManagementSettings( [ IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF, @@ -1994,8 +1879,7 @@ powerPage.async(resolve); }) .then(function() { - assertTrue(powerPage.shadowRoot.querySelector('#lidClosedToggle') - .hidden); + assertTrue(powerPage.$$('#lidClosedToggle').hidden); }); }); @@ -2017,10 +1901,7 @@ powerPage.async(resolve); }) .then(function() { - assertEquals( - null, - powerPage.shadowRoot.querySelector( - '#batteryIdleSettingBox')); + assertEquals(null, powerPage.$$('#batteryIdleSettingBox')); }); }); @@ -2062,9 +1943,9 @@ .then(function(page) { stylusPage = page; browserProxy = DevicePageBrowserProxyImpl.getInstance(); - appSelector = assert(page.shadowRoot.querySelector('#selectApp')); - noAppsDiv = assert(page.shadowRoot.querySelector('#no-apps')); - waitingDiv = assert(page.shadowRoot.querySelector('#waiting')); + appSelector = assert(page.$$('#selectApp')); + noAppsDiv = assert(page.$$('#no-apps')); + waitingDiv = assert(page.$$('#waiting')); LockScreenSupport = NoteAppLockScreenSupport; assertEquals(1, browserProxy.requestNoteTakingApps_); @@ -2084,31 +1965,27 @@ /** @return {?Element} */ function noteTakingAppLockScreenSettings() { - return stylusPage.shadowRoot.querySelector( - '#note-taking-app-lock-screen-settings'); + return stylusPage.$$('#note-taking-app-lock-screen-settings'); } /** @return {?Element} */ function enableAppOnLockScreenToggle() { - return stylusPage.shadowRoot.querySelector( - '#enable-app-on-lock-screen-toggle'); + return stylusPage.$$('#enable-app-on-lock-screen-toggle'); } /** @return {?Element} */ function enableAppOnLockScreenPolicyIndicator() { - return stylusPage.shadowRoot.querySelector( - '#enable-app-on-lock-screen-policy-indicator'); + return stylusPage.$$('#enable-app-on-lock-screen-policy-indicator'); } /** @return {?Element} */ function enableAppOnLockScreenToggleLabel() { - return stylusPage.shadowRoot.querySelector('#lock-screen-toggle-label'); + return stylusPage.$$('#lock-screen-toggle-label'); } /** @return {?Element} */ function keepLastNoteOnLockScreenToggle() { - return stylusPage.shadowRoot.querySelector( - '#keep-last-note-on-lock-screen-toggle'); + return stylusPage.$$('#keep-last-note-on-lock-screen-toggle'); } test('stylus tools prefs', function() { @@ -2119,26 +1996,19 @@ // Since both prefs are initially false, the launch palette on eject pref // toggle is disabled. - assertTrue(isVisible( - stylusPage.shadowRoot.querySelector('#enableStylusToolsToggle'))); - assertTrue(isVisible(stylusPage.shadowRoot.querySelector( - '#launchPaletteOnEjectEventToggle'))); - assertTrue(stylusPage.shadowRoot - .querySelector('#launchPaletteOnEjectEventToggle') - .disabled); + assertTrue(isVisible(stylusPage.$$('#enableStylusToolsToggle'))); + assertTrue(isVisible(stylusPage.$$('#launchPaletteOnEjectEventToggle'))); + assertTrue(stylusPage.$$('#launchPaletteOnEjectEventToggle').disabled); assertFalse(devicePage.prefs.settings.enable_stylus_tools.value); assertFalse( devicePage.prefs.settings.launch_palette_on_eject_event.value); // Tapping the enable stylus tools pref causes the launch palette on // eject pref toggle to not be disabled anymore. - stylusPage.shadowRoot.querySelector('#enableStylusToolsToggle').click(); + stylusPage.$$('#enableStylusToolsToggle').click(); assertTrue(devicePage.prefs.settings.enable_stylus_tools.value); - assertFalse(stylusPage.shadowRoot - .querySelector('#launchPaletteOnEjectEventToggle') - .disabled); - stylusPage.shadowRoot.querySelector('#launchPaletteOnEjectEventToggle') - .click(); + assertFalse(stylusPage.$$('#launchPaletteOnEjectEventToggle').disabled); + stylusPage.$$('#launchPaletteOnEjectEventToggle').click(); assertTrue(devicePage.prefs.settings.launch_palette_on_eject_event.value); }); @@ -2213,8 +2083,7 @@ browserProxy.setAndroidAppsReceived(true); return checkDeepLink( - routes.STYLUS, '417', - stylusPage.shadowRoot.querySelector('#selectApp'), + routes.STYLUS, '417', stylusPage.$$('#selectApp'), 'Note-taking apps dropdown'); }); @@ -2619,7 +2488,7 @@ * @return {string} */ function getStorageItemLabelFromId(id) { - const rowItem = storagePage.shadowRoot.querySelector('#' + id).shadowRoot; + const rowItem = storagePage.$$('#' + id).shadowRoot; return rowItem.querySelector('#label').innerText; } @@ -2628,7 +2497,7 @@ * @return {string} */ function getStorageItemSubLabelFromId(id) { - const rowItem = storagePage.shadowRoot.querySelector('#' + id).shadowRoot; + const rowItem = storagePage.$$('#' + id).shadowRoot; return rowItem.querySelector('#subLabel').innerText; } @@ -2650,13 +2519,10 @@ sendStorageSizeStat('9.1 GB', '0.9 GB', 0.91, StorageSpaceState.LOW); assertEquals('91%', storagePage.$.inUseLabelArea.style.width); assertEquals('9%', storagePage.$.availableLabelArea.style.width); - assertTrue( - isVisible(storagePage.shadowRoot.querySelector('#lowMessage'))); - assertFalse(isVisible( - storagePage.shadowRoot.querySelector('#criticallyLowMessage'))); - assertTrue(!!storagePage.shadowRoot.querySelector('#bar.space-low')); - assertFalse( - !!storagePage.shadowRoot.querySelector('#bar.space-critically-low')); + assertTrue(isVisible(storagePage.$$('#lowMessage'))); + assertFalse(isVisible(storagePage.$$('#criticallyLowMessage'))); + assertTrue(!!storagePage.$$('#bar.space-low')); + assertFalse(!!storagePage.$$('#bar.space-critically-low')); assertEquals( '9.1 GB', storagePage.$.inUseLabelArea.querySelector('.storage-size') @@ -2671,13 +2537,10 @@ '9.7 GB', '0.3 GB', 0.97, StorageSpaceState.CRITICALLY_LOW); assertEquals('97%', storagePage.$.inUseLabelArea.style.width); assertEquals('3%', storagePage.$.availableLabelArea.style.width); - assertFalse( - isVisible(storagePage.shadowRoot.querySelector('#lowMessage'))); - assertTrue(isVisible( - storagePage.shadowRoot.querySelector('#criticallyLowMessage'))); - assertFalse(!!storagePage.shadowRoot.querySelector('#bar.space-low')); - assertTrue( - !!storagePage.shadowRoot.querySelector('#bar.space-critically-low')); + assertFalse(isVisible(storagePage.$$('#lowMessage'))); + assertTrue(isVisible(storagePage.$$('#criticallyLowMessage'))); + assertFalse(!!storagePage.$$('#bar.space-low')); + assertTrue(!!storagePage.$$('#bar.space-critically-low')); assertEquals( '9.7 GB', storagePage.$.inUseLabelArea.querySelector('.storage-size') @@ -2691,13 +2554,10 @@ sendStorageSizeStat('2.5 GB', '7.5 GB', 0.25, StorageSpaceState.NORMAL); assertEquals('25%', storagePage.$.inUseLabelArea.style.width); assertEquals('75%', storagePage.$.availableLabelArea.style.width); - assertFalse( - isVisible(storagePage.shadowRoot.querySelector('#lowMessage'))); - assertFalse(isVisible( - storagePage.shadowRoot.querySelector('#criticallyLowMessage'))); - assertFalse(!!storagePage.shadowRoot.querySelector('#bar.space-low')); - assertFalse( - !!storagePage.shadowRoot.querySelector('#bar.space-critically-low')); + assertFalse(isVisible(storagePage.$$('#lowMessage'))); + assertFalse(isVisible(storagePage.$$('#criticallyLowMessage'))); + assertFalse(!!storagePage.$$('#bar.space-low')); + assertFalse(!!storagePage.$$('#bar.space-critically-low')); assertEquals( '2.5 GB', storagePage.$.inUseLabelArea.querySelector('.storage-size') @@ -2709,27 +2569,19 @@ }); test('system size', async function() { + assertEquals('System', storagePage.$$('#systemSizeLabel').innerText); assertEquals( - 'System', - storagePage.shadowRoot.querySelector('#systemSizeLabel').innerText); - assertEquals( - 'Calculating…', - storagePage.shadowRoot.querySelector('#systemSizeSubLabel') - .innerText); + 'Calculating…', storagePage.$$('#systemSizeSubLabel').innerText); // Send system size callback. webUIListenerCallback('storage-system-size-changed', '8.4 GB'); flush(); - assertEquals( - '8.4 GB', - storagePage.shadowRoot.querySelector('#systemSizeSubLabel') - .innerText); + assertEquals('8.4 GB', storagePage.$$('#systemSizeSubLabel').innerText); // In guest mode, the system row should be hidden. storagePage.isGuest_ = true; flush(); - assertFalse( - isVisible(storagePage.shadowRoot.querySelector('#systemSize'))); + assertFalse(isVisible(storagePage.$$('#systemSize'))); }); test('apps extensions size', async function() { @@ -2746,8 +2598,7 @@ test('other users size', async function() { // The other users row is visible by default, displaying // "calculating...". - assertTrue( - isVisible(storagePage.shadowRoot.querySelector('#otherUsersSize'))); + assertTrue(isVisible(storagePage.$$('#otherUsersSize'))); assertEquals('Other users', getStorageItemLabelFromId('otherUsersSize')); assertEquals( 'Calculating…', getStorageItemSubLabelFromId('otherUsersSize')); @@ -2755,15 +2606,13 @@ // Simulate absence of other users. webUIListenerCallback('storage-other-users-size-changed', '0 B', true); flush(); - assertFalse( - isVisible(storagePage.shadowRoot.querySelector('#otherUsersSize'))); + assertFalse(isVisible(storagePage.$$('#otherUsersSize'))); // Send other users callback with a size that is not null. webUIListenerCallback( 'storage-other-users-size-changed', '322 MB', false); flush(); - assertTrue( - isVisible(storagePage.shadowRoot.querySelector('#otherUsersSize'))); + assertTrue(isVisible(storagePage.$$('#otherUsersSize'))); assertEquals('322 MB', getStorageItemSubLabelFromId('otherUsersSize')); // If the user is in Guest mode, the row is not visible. @@ -2771,8 +2620,7 @@ webUIListenerCallback( 'storage-other-users-size-changed', '322 MB', false); flush(); - assertFalse( - isVisible(storagePage.shadowRoot.querySelector('#otherUsersSize'))); + assertFalse(isVisible(storagePage.$$('#otherUsersSize'))); }); }); });
diff --git a/chrome/test/data/webui/settings/chromeos/manage_accessibility_page_tests.js b/chrome/test/data/webui/settings/chromeos/manage_accessibility_page_tests.js index 407b6550..1010485 100644 --- a/chrome/test/data/webui/settings/chromeos/manage_accessibility_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/manage_accessibility_page_tests.js
@@ -92,7 +92,7 @@ setup(function() { deviceBrowserProxy = new TestDevicePageBrowserProxy(); - DevicePageBrowserProxyImpl.setInstance(deviceBrowserProxy); + DevicePageBrowserProxyImpl.instance_ = deviceBrowserProxy; PolymerTest.clearBody(); });
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 26e9164..c92a551 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -14748.0.0 \ No newline at end of file +14764.0.0 \ No newline at end of file
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge.cc index 248cd82..3fa1a69 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_bridge.cc +++ b/chromeos/components/sync_wifi/wifi_configuration_bridge.cc
@@ -294,6 +294,27 @@ .SerializeToString(); } +void WifiConfigurationBridge::ApplyStopSyncChanges( + std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) { + if (!delete_metadata_change_list) { + return; + } + + // Since bridge and ModelTypeStore state represents the synced networks state, + // while actual data is stored by Shill, it's appropriate to treat all data + // stored by bridge as metadata and clear it out when processor requests to + // clear metadata. MergeSyncData() will be called once sync is starting again. + entries_.clear(); + pending_deletes_.clear(); + network_guid_to_timer_map_.clear(); + networks_to_sync_when_ready_.clear(); + if (store_) { + store_->DeleteAllDataAndMetadata(base::DoNothing()); + } + // Callbacks are no longer valid. + weak_ptr_factory_.InvalidateWeakPtrs(); +} + void WifiConfigurationBridge::OnStoreCreated( const absl::optional<syncer::ModelError>& error, std::unique_ptr<syncer::ModelTypeStore> store) {
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge.h b/chromeos/components/sync_wifi/wifi_configuration_bridge.h index d396c40..18b300e 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_bridge.h +++ b/chromeos/components/sync_wifi/wifi_configuration_bridge.h
@@ -78,6 +78,8 @@ void GetAllDataForDebugging(DataCallback callback) override; std::string GetClientTag(const syncer::EntityData& entity_data) override; std::string GetStorageKey(const syncer::EntityData& entity_data) override; + void ApplyStopSyncChanges(std::unique_ptr<syncer::MetadataChangeList> + delete_metadata_change_list) override; // NetworkMetadataObserver: void OnFirstConnectionToNetwork(const std::string& guid) override;
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc index da95a49..b72d437 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc +++ b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
@@ -509,6 +509,72 @@ histogram_tester.ExpectTotalCount(kTotalCountHistogram, 1); } +TEST_F(WifiConfigurationBridgeTest, ApplyStopSyncChangesAndMergeSyncData) { + InitializeSyncStore(); + + // Mimic initial sync with single sync network. + auto metadata_change_list1 = + std::make_unique<syncer::InMemoryMetadataChangeList>(); + syncer::EntityChangeList entity_data1; + + WifiConfigurationSpecifics meow_sync = + GenerateTestWifiSpecifics(meow_network_id(), kSyncPsk, /*timestamp=*/100); + entity_data1.push_back( + syncer::EntityChange::CreateAdd(meow_network_id().SerializeToString(), + GenerateWifiEntityData(meow_sync))); + bridge()->MergeSyncData(std::move(metadata_change_list1), + std::move(entity_data1)); + base::RunLoop().RunUntilIdle(); + + // Verify sync network was added to local stack. + const std::vector<sync_pb::WifiConfigurationSpecifics>& + updated_local_networks = synced_network_updater()->add_or_update_calls(); + EXPECT_EQ(1u, updated_local_networks.size()); + EXPECT_TRUE(VectorContainsProto(updated_local_networks, meow_sync)); + + // Mimic sync being stopped with request to clear metadata. + bridge()->ApplyStopSyncChanges( + std::make_unique<syncer::InMemoryMetadataChangeList>()); + + // Add local network while sync is not running. + WifiConfigurationSpecifics woof_local = + GenerateTestWifiSpecifics(woof_network_id(), kLocalPsk, /*timestamp=*/1); + local_network_collector()->AddNetwork(woof_local); + + // Add sync network while sync is not running. + auto metadata_change_list2 = + std::make_unique<syncer::InMemoryMetadataChangeList>(); + auto entity_data2 = syncer::EntityChangeList(); + WifiConfigurationSpecifics honk_sync = + GenerateTestWifiSpecifics(honk_network_id(), kSyncPsk, /*timestamp=*/100); + entity_data2.push_back( + syncer::EntityChange::CreateAdd(meow_network_id().SerializeToString(), + GenerateWifiEntityData(meow_sync))); + entity_data2.push_back( + syncer::EntityChange::CreateAdd(honk_network_id().SerializeToString(), + GenerateWifiEntityData(honk_sync))); + + // Mimic sync restart and trigger initial sync. + std::string storage_key; + EXPECT_CALL(*processor(), Put(_, _, _)) + .WillOnce(testing::SaveArg<0>(&storage_key)); + + bridge()->MergeSyncData(std::move(metadata_change_list2), + std::move(entity_data2)); + base::RunLoop().RunUntilIdle(); + + // Verify local network was added to sync. + EXPECT_EQ(storage_key, woof_network_id().SerializeToString()); + + // Verify local state. + std::vector<sync_pb::WifiConfigurationSpecifics> sync_networks = + GetAllSyncedData(); + EXPECT_EQ(3u, sync_networks.size()); + EXPECT_TRUE(VectorContainsProto(sync_networks, meow_sync)); + EXPECT_TRUE(VectorContainsProto(sync_networks, woof_local)); + EXPECT_TRUE(VectorContainsProto(sync_networks, honk_sync)); +} + TEST_F(WifiConfigurationBridgeTest, LocalConfigured) { InitializeSyncStore();
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom index 6a620b1a..d7bedf0c 100644 --- a/chromeos/crosapi/mojom/crosapi.mojom +++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -715,8 +715,8 @@ // If ash-chrome is newer than the browser, then some fields may not be // processed by the browser. // -// Next version: 43 -// Next id: 43 +// Next version: 44 +// Next id: 44 [Stable, RenamedFrom="crosapi.mojom.LacrosInitParams"] struct BrowserInitParams { // This is ash-chrome's version of the Crosapi interface. This is used by @@ -984,7 +984,13 @@ // the map are serialized PolicyFetchResponse proto messages from // components/policy/proto/device_management_backend.proto. [MinVersion=41] - map<crosapi.mojom.PolicyNamespace, array<uint8>>? device_account_component_policy@41; + map<crosapi.mojom.PolicyNamespace, array<uint8>>? REMOVED_41@41; + + // Component (i.e. chrome extensions) policy for the device account. + // Maps `PolicyNamespace` representing an extension to the JSON policy + // value for that extension. + [MinVersion=43] + map<crosapi.mojom.PolicyNamespace, mojo_base.mojom.Value>? device_account_component_policy@43; }; // Parameters to specify OpenUrl behavior. @@ -1019,8 +1025,8 @@ // has accidentally become a kitchen sink for different features. This was not // intentional. // -// Next MinVersion: 67. -// Next ID: 18 +// Next MinVersion: 68. +// Next ID: 19 // [Stable, Uuid="4e04dc16-b34c-40fd-9e3f-3c55c2c6cf91", RenamedFrom="crosapi.mojom.LacrosChromeService"] @@ -1138,11 +1144,16 @@ [MinVersion=64] OpenForFullRestore@15(); + // The old UpdateComponentPolicy method. + [MinVersion=67] + REMOVED_16@16(map<crosapi.mojom.PolicyNamespace, array<uint8>> policy); + // Notifies Lacros to update the component policy data. The values of the map - // are serialized PolicyFetchResponse proto messages from - // components/policy/proto/device_management_backend.proto. - [MinVersion=65] - UpdateComponentPolicy@16(map<crosapi.mojom.PolicyNamespace, array<uint8>> policy); + // are JSON policy data downloaded by Ash. The `component_policy` argument + // maps `PolicyNamespace` representing an extension to the JSON policy value + // for that extension. + [MinVersion=67] + UpdateComponentPolicy@18(map<crosapi.mojom.PolicyNamespace, mojo_base.mojom.Value> component_policy); }; // TODO(crbug.com/1180712): move to its own file. Currently due to circular
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index 121d4bf..72640d9 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">ፊርምዌር በማዘመን ላይ ሳለ ይህን ውጫዊ መሣሪያ አይንቀሉት ወይም ኮምፒውተርዎን አይዝጉት። ይህን መስኮት መቀነስ ይችላሉ። ይህ ዝማኔ ጥቂት ደቂቃዎች ሊወስድ ይችላል፣ እና በዚህ ጊዜ የእርስዎ ውጫዊ መሣሪያ ላይሰራ ይችላል።</translation> <translation id="3486220673238053218">ብየና</translation> <translation id="3488065109653206955">በከፊል ገብሯል</translation> +<translation id="3517001332549868749">የChromeOS ዝማኔ</translation> <translation id="3527036260304016759">አልተሳካም - ያልታወቀ ስህተት</translation> <translation id="3532980081107202182"><ph name="MIN_REMAINING" /> ደቂቃዎች ገደማ ይቀራል</translation> <translation id="3557205324756024651">የአካባቢ ማንነት (ከተፈለገ)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">ከእርስዎ ምርጫ ጋር የተገናኘ መረጃ ያግኙ</translation> <translation id="6704062477274546131">የዲኤንኤስ መፍትሔ</translation> <translation id="6723839937902243910">ኃይል</translation> +<translation id="6723847290197874913">የቁልፍ ሰሌዳ የጀርባ ብርሃን</translation> <translation id="672609503628871915">ምን አዲስ ነገር እንዳለ ይመልከቱ</translation> <translation id="6747215703636344499">ቆሟል - ውፅዓት ሞልቷል</translation> <translation id="6749473226660745022">ፎቶዎች</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb index 801a0f2..4d310ab 100644 --- a/chromeos/strings/chromeos_strings_as.xtb +++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">ডিছপ্লে’ৰ উজ্জ্বলতা ডাউন</translation> <translation id="2104796393919810494">মেৰামতি সম্পূৰ্ণ হৈছে</translation> <translation id="2105810540595158374">ডিভাইচটো এটা গে’ম নিয়ন্ত্ৰক।</translation> +<translation id="2115956742084455574">ভুল ক’ড</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, সংস্কৰণ <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="TOTAL_MEMORY" /> জিবিৰ <ph name="AVAILABLE_MEMORY" /> জিবি উপলব্ধ আছে</translation> <translation id="2138109643290557664">ভাসমান</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">ওচৰ-পাজৰৰ ডিভাইচসমূহ চাবলৈ ব্লুটুথ অন কৰক</translation> <translation id="2346474577291266260">উত্তম (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463"><ph name="LINK_BEGIN" />অযোগ্য উপাদান<ph name="LINK_END" /> চিনাক্ত কৰা হৈছে। আপুনি যদি এইটো ইনষ্টল হৈছেনে নাই সেয়া নিশ্চিত কৰিবলৈ বিচাৰে, অনুগ্ৰহ কৰি সেয়া এতিয়াই কৰক।</translation> <translation id="2363636958541445404">স্ক্ৰীন ছেভাৰৰ বিকল্পসমূহ বাছনি কৰিবলৈ সুবিধাটো অন কৰক</translation> <translation id="2364498172489649528">পাছ কৰিছে</translation> <translation id="2380886658946992094">লিগেল</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />এমএ</translation> <translation id="3056720590588772262">এণ্ডপইণ্ট</translation> <translation id="3069085583900247081">পৰীক্ষা বিফল হৈছে</translation> +<translation id="3076243757415932261">উপাদানৰ মান্যতা নিৰূপণ কৰি থকা হৈছে...</translation> <translation id="3083667275341675831">সংযোগ সম্পৰ্কীয় ডায়গন’ষ্টিক্স</translation> <translation id="3084958266922136097">স্ক্ৰীন ছেভাৰ অক্ষম কৰক</translation> <translation id="3091839911843451378">বিফল হৈছে - বন্ধ হৈছে</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">সংযোগ কৰা হ’ল</translation> <translation id="3369013195428705271">আপুনি সকলো প্ৰিণ্টৰ ইতিহাস নিশ্চিতভাৱে মচিব বিচাৰেনে? আপোনাৰ চলি থকা প্ৰিণ্টৰ কামসমূহ মচা নহয়।</translation> <translation id="3404249063913988450">স্ক্ৰীন ছেভাৰ সক্ষম কৰক</translation> +<translation id="3404770484521709967">উপাদানসমূহ সঠিকভাৱে ইনষ্টল হৈছে।</translation> <translation id="3413935475507503304">আপডে’টটো কাৰ্যকৰী কৰিবলৈ, পৰৱৰ্তীত টিপক।</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">সুৰক্ষা</translation> @@ -566,6 +570,7 @@ <translation id="6768237774506518020">DNSৰ সমাধান বিফল হোৱাৰ হাৰ উচ্চ</translation> <translation id="680983167891198932">কী</translation> <translation id="6816797338148849397">আপুনি কৰা বাছনি সম্পৰ্কীয় তথ্য উপলব্ধ। এক্সেছ কৰিবলৈ উপৰমুৱা কাঁড়চিহ্নৰ কী ব্যৱহাৰ কৰক।</translation> +<translation id="6840315122969944400"><ph name="DEVICE_TYPE" />ৰ মেৰামতি</translation> <translation id="6853312040151791195">চাৰ্জ খৰচ হোৱাৰ হাৰ</translation> <translation id="6889786074662672253">ৰিষ্টাৰ্ট কৰি থকাৰ সময়ত, এই বাহ্যিক ডিভাইচটো আনপ্লাগ অথবা আপোনাৰ কম্পিউটাৰটো শ্বাট ডাউন নকৰিব। আপুনি এই ৱিণ্ড’খন মিনিমাইজ কৰিব পাৰে। এইটোৰ বাবে কেইমিনিটমান সময় লাগিব পাৰে আৰু এই সময়খিনিত আপোনাৰ বাহ্যিক ডিভাইচটোৱে কাম নকৰিব পাৰে।</translation> <translation id="6905724422583748843"><ph name="PAGE_NAME" />লৈ উভতি যাওক</translation> @@ -674,6 +679,7 @@ <translation id="8045012663542226664">মাইক্ৰ’ফ’ন মিউট কৰক</translation> <translation id="8075838845814659848">বাকী থকা চাৰ্জ</translation> <translation id="8082366717211101304">Android এপৰ পৰা DNS সমাধান কৰিব নোৱাৰি</translation> +<translation id="8083281199617904460">মেৰামতি কৰাৰ প্ৰক্ৰিয়াটো কেৱল প্ৰশিক্ষণপ্ৰাপ্ত মেৰামতি কৰা টেকনিচিয়ানৰ বাবেহে। কাম নকৰা উপাদানসমূহ সলনি কৰাৰ পাছতহে ষ্টাৰ্ট কৰক।</translation> <translation id="808894953321890993">পাছৱৰ্ড সলনি কৰক</translation> <translation id="8104083085214006426">আপুনি এটা মুক্ত আৰু অসুৰক্ষিত নেটৱৰ্ক ব্যৱহাৰ কৰি আছে</translation> <translation id="811820734797650957">(Android) গে’টৱে’ পিং কৰিব পাৰি</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index 01ee1fa8..0849640 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Displey parlaqlığını azaldın</translation> <translation id="2104796393919810494">Təmir tamamlanıb</translation> <translation id="2105810540595158374">Cihaz oyun nizamlayıcısıdır.</translation> +<translation id="2115956742084455574">Yanlış kod</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, versiya <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="AVAILABLE_MEMORY" />/<ph name="TOTAL_MEMORY" /> GB əlçatandır</translation> <translation id="2138109643290557664">Üzmə</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Yaxınlıqdakı cihazları tapmaq üçün Bluetooth'u aktiv edin</translation> <translation id="2346474577291266260">Əla (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463"><ph name="LINK_BEGIN" />Uyğunsuz komponentlər<ph name="LINK_END" /> aşkarlanıb. Bunun quraşdırıldığını təsdiqləməyi seçsəniz, indi bunu edin.</translation> <translation id="2363636958541445404">Ekran qoruyucu seçimlərini seçmək üçün funksiyanı aktiv edin</translation> <translation id="2364498172489649528">Keçdi</translation> <translation id="2380886658946992094">Hüquqi</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation> <translation id="3056720590588772262">Son nöqtə</translation> <translation id="3069085583900247081">Test uğursuz oldu</translation> +<translation id="3076243757415932261">Komponentlər doğrulanır...</translation> <translation id="3083667275341675831">Bağlantı Diaqnostikası</translation> <translation id="3084958266922136097">Ekran qoruyucusunu deaktiv edin</translation> <translation id="3091839911843451378">Alınmadı - Dayandırılıb</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Qoşuludur</translation> <translation id="3369013195428705271">Bütün çap tarixçəsini silmək istədiyinizə əminsiniz? Davam edən çap işləriniz silinməyəcək.</translation> <translation id="3404249063913988450">Ekran qoruyucusunu aktiv edin</translation> +<translation id="3404770484521709967">Komponentlər düzgün quraşdırılıb.</translation> <translation id="3413935475507503304">Güncəlləməyə keçmək üçün "Növbəti" seçiminə toxunun.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">Təhlükəsizlik</translation> @@ -371,6 +375,7 @@ <translation id="4890353053343094602">Dərhal yenisini seçin</translation> <translation id="4891842000192098784">Gərginlik</translation> <translation id="4897058166682006107">Sol qulaqlığın batareya səviyyəsi: <ph name="BATTERY_PERCENTAGE" />%.</translation> +<translation id="4915052247106771211">Cihazı zavod ayarlarına sıfırlanacaq (Powerwash).</translation> <translation id="4917385247580444890">Güclü</translation> <translation id="4917889632206600977">Dayanıb - Kağız yoxdur</translation> <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> saniyədə <ph name="RATE" /> şarj edilib.</translation> @@ -424,6 +429,7 @@ <translation id="5358174242040570474">Xəta oldu. Yenidən divar kağızı seçin və ya tətbiqi yenidən açın.</translation> <translation id="5372659122375744710">WiFi şəbəkəsi güvənli deyil</translation> <translation id="5376354385557966694">Avtomatik işıqlı rejim</translation> +<translation id="537872351913703572">Cihaz başqa istifadəçinin və ya təşkilatın mülkiyyətinə keçəcək</translation> <translation id="5400907029458559844">Cihaz qoşulur.</translation> <translation id="5401938042319910061">Bütün Rejimləri İşə Salın</translation> <translation id="5423849171846380976">Aktivləşdirildi</translation> @@ -565,6 +571,7 @@ <translation id="6768237774506518020">DNS həllinin alınmama faizi yüksəkdir</translation> <translation id="680983167891198932">Açar</translation> <translation id="6816797338148849397">Seçiminizlə əlaqəli məlumat əlçatandır. Giriş üçün Yuxarı ox düyməsini istifadə edin.</translation> +<translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> təmiri</translation> <translation id="6853312040151791195">Deşarj faizi</translation> <translation id="6889786074662672253">Yenidən başlatma zamanı bu xarici cihazı ayırmayın və ya kompüterinizi söndürməyin. Bu pəncərəni kiçildə bilərsiniz. Bu, bir neçə dəqiqə çəkə bilər və xarici cihazınız bu müddət ərzində işləməyə bilər.</translation> <translation id="6905724422583748843"><ph name="PAGE_NAME" /> səhifəsinə qayıdın</translation> @@ -673,6 +680,7 @@ <translation id="8045012663542226664">Mikrofonun səssiz düyməsi</translation> <translation id="8075838845814659848">Qalan şarj</translation> <translation id="8082366717211101304">Android tətbiqlərindən DNS'i həll etmək olmur</translation> +<translation id="8083281199617904460">Bu təmir prosesi təlim keçmiş təmir ustası üçün nəzərdə tutulub. Yalnız nasaz komponentləri dəyişdirdikdən sonra başlayın.</translation> <translation id="808894953321890993">Parolu dəyişin</translation> <translation id="8104083085214006426">Açıq və güvənsiz şəbəkədən istifadə edirsiniz</translation> <translation id="811820734797650957">(Android) Giriş test edilə bilər</translation> @@ -726,6 +734,7 @@ <translation id="8671972493856476349"><ph name="VERSION_NUMBER" /> versiyasına güncəlləyin və yenidən başladın</translation> <translation id="8675354002693747642">Öncədən paylaşılan açar</translation> <translation id="8677859815076891398">Albom yoxdur. <ph name="LINK_BEGIN" />Google Fotoda<ph name="LINK_END" /> albom yaradın.</translation> +<translation id="8680431479333800907">Cihaz eyni istifadəçinin mülkiyyətinə keçəcək</translation> <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Bu funksiyanı idarə etmək üçün Sol və ya Sağ ox düyməsini istifadə edin.</translation> <translation id="8712637175834984815">Anladım</translation> <translation id="871560550817059752">Alınmadı - Mürəkkəb yoxdur</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 9901f72..f6ccd8f 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Smanjivanje osvjetljenja ekrana</translation> <translation id="2104796393919810494">Popravka je završena</translation> <translation id="2105810540595158374">Uređaj je kontroler za igre.</translation> +<translation id="2115956742084455574">Netočan kôd</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, verzija <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736">Dostupno je <ph name="AVAILABLE_MEMORY" /> GB od <ph name="TOTAL_MEMORY" /> GB</translation> <translation id="2138109643290557664">Lebdite</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Uključite Bluetooth da otkrijete uređaje u blizini</translation> <translation id="2346474577291266260">Odlično (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">Otkrivene su <ph name="LINK_BEGIN" />nekvalificirane komponente<ph name="LINK_END" />. Ako želite potvrditi da su instalirane, učinite to odmah.</translation> <translation id="2363636958541445404">Uključite funkcije da odaberete opcije čuvara ekrana</translation> <translation id="2364498172489649528">Uspješno</translation> <translation id="2380886658946992094">Pravo</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation> <translation id="3056720590588772262">Krajnja tačka</translation> <translation id="3069085583900247081">Test nije uspio</translation> +<translation id="3076243757415932261">Validacija komponenti...</translation> <translation id="3083667275341675831">Dijagnostika povezivosti</translation> <translation id="3084958266922136097">Onemogućite čuvara ekrana</translation> <translation id="3091839911843451378">Nije uspjelo – zaustavljeno</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Povezano</translation> <translation id="3369013195428705271">Jeste li sigurni da želite obrisati svu historiju štampanja? Vaši trenutni zadaci štampanja se neće izbrisati.</translation> <translation id="3404249063913988450">Omogućite čuvara ekrana</translation> +<translation id="3404770484521709967">Komponente su instalirane točno.</translation> <translation id="3413935475507503304">Da nastavite s ažuriranjem, kliknite na Naprijed.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">Sigurnost</translation> @@ -229,7 +233,7 @@ <translation id="3484914941826596830">Nemojte iskopčati ovaj vanjski uređaj ili isključiti računar dok traje ažuriranje firmvera. Ovaj prozor možete minimizirati. Ovo ažuriranje može potrajati nekoliko minuta. Moguće je da za to vrijeme vanjski uređaj neće funkcionirati.</translation> <translation id="3486220673238053218">definicija</translation> <translation id="3488065109653206955">Djelimično aktivirano</translation> -<translation id="3517001332549868749">Ažuriranje OS-a Chrome</translation> +<translation id="3517001332549868749">Ažuriranje ChromeOS-a</translation> <translation id="3527036260304016759">Nije uspjelo – nepoznata greška</translation> <translation id="3532980081107202182">Preostalo je oko <ph name="MIN_REMAINING" /> min</translation> <translation id="3557205324756024651">Lokalni identitet (nije obavezno)</translation> @@ -555,7 +559,7 @@ <translation id="6692996468359469499">Primajte informacije u vezi s vašim odabirom</translation> <translation id="6704062477274546131">Razrješavanje DNS-a</translation> <translation id="6723839937902243910">Napajanje</translation> -<translation id="6723847290197874913">Pozadinsko osvjetljenje tipkovnice</translation> +<translation id="6723847290197874913">Pozadinsko svjetlo tastature</translation> <translation id="672609503628871915">Pogledajte što je novo</translation> <translation id="6747215703636344499">Zaustavljeno – izlaz je pun</translation> <translation id="6749473226660745022">Fotografije</translation> @@ -566,6 +570,7 @@ <translation id="6768237774506518020">Visoka stopa neuspjeha DNS rezolucije</translation> <translation id="680983167891198932">Ključ</translation> <translation id="6816797338148849397">Dostupne su informacije u vezi s vašim odabirom. Pristupite tipkom strelice nagore.</translation> +<translation id="6840315122969944400">Popravak uređaja <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">Brzina pražnjenja</translation> <translation id="6889786074662672253">Dok traje ponovno pokretanje, nemojte iskopčati ovaj vanjski uređaj ili isključiti računar. Ovaj prozor možete minimizirati. Ovo može potrajati nekoliko minuta. Moguće je da za to vrijeme vanjski uređaj neće funkcionirati.</translation> <translation id="6905724422583748843">Nazad na stranicu <ph name="PAGE_NAME" /></translation> @@ -674,6 +679,7 @@ <translation id="8045012663542226664">Isključivanje zvuka mikrofona</translation> <translation id="8075838845814659848">Preostali nivo napunjenosti</translation> <translation id="8082366717211101304">Nije moguće razriješiti DNS iz Android aplikacija</translation> +<translation id="8083281199617904460">Postupak popravka smiju vršiti samo obučeni tehničari. Pokrenite ga tek nakon zamjene neispravnih komponenti.</translation> <translation id="808894953321890993">Promijeni lozinku</translation> <translation id="8104083085214006426">Koristite otvorenu i nezaštićenu mrežu</translation> <translation id="811820734797650957">(Android) Pristupnik se može provjeriti pingom</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index f4fa2d7..23e6f53 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Během aktualizace firmwaru neodpojujte externí zařízení ani nevypínejte počítač. Toto okno můžete minimalizovat. Aktualizace může trvat několik minut a externí zařízení po tuto dobu nemusí fungovat.</translation> <translation id="3486220673238053218">definice</translation> <translation id="3488065109653206955">Částečně aktivováno</translation> +<translation id="3517001332549868749">Aktualizace ChromeOS</translation> <translation id="3527036260304016759">Tisk selhal – neznámá chyba</translation> <translation id="3532980081107202182">Zbývající minuty: <ph name="MIN_REMAINING" /></translation> <translation id="3557205324756024651">Místní identita (volitelné)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Získejte informace týkající se vybraného obsahu</translation> <translation id="6704062477274546131">Překlad DNS</translation> <translation id="6723839937902243910">Napájení</translation> +<translation id="6723847290197874913">Podsvícení klávesnice</translation> <translation id="672609503628871915">Co je nového</translation> <translation id="6747215703636344499">Zastaveno – výstupní zásobník je plný</translation> <translation id="6749473226660745022">Fotky</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index 7da65f00..53fee95 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Du må ikke frakoble den eksterne enhed eller slukke din computer, mens firmwaren opdaterer. Du kan minimere dette vindue. Denne opdatering kan tage et par minutter, og din eksterne enhed fungerer muligvis ikke under opdateringen.</translation> <translation id="3486220673238053218">definition</translation> <translation id="3488065109653206955">Delvist aktiveret</translation> +<translation id="3517001332549868749">ChromeOS-opdatering</translation> <translation id="3527036260304016759">Handlingen mislykkedes – Ukendt fejl</translation> <translation id="3532980081107202182">Ca. <ph name="MIN_REMAINING" /> minutter tilbage</translation> <translation id="3557205324756024651">Lokal identitet (valgfrit)</translation> @@ -553,6 +554,7 @@ <translation id="6692996468359469499">Få oplysninger om det, du har markeret</translation> <translation id="6704062477274546131">DNS-udførelse</translation> <translation id="6723839937902243910">Strøm</translation> +<translation id="6723847290197874913">Tastaturlys</translation> <translation id="672609503628871915">Se de nye funktioner</translation> <translation id="6747215703636344499">Stoppet – Fuld udskriftsbakke</translation> <translation id="6749473226660745022">Billeder</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 6b6b22b1..a2ae804 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Displayhelligkeit verringern</translation> <translation id="2104796393919810494">Reparatur abgeschlossen</translation> <translation id="2105810540595158374">Das Gerät ist ein Controller.</translation> +<translation id="2115956742084455574">Falscher Code</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, Version <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="AVAILABLE_MEMORY" /> GB von <ph name="TOTAL_MEMORY" /> GB sind verfügbar</translation> <translation id="2138109643290557664">Einfach treiben lassen</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Aktiviere Bluetooth, damit Geräte in der Nähe gefunden werden</translation> <translation id="2346474577291266260">Sehr gut (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">Es wurden <ph name="LINK_BEGIN" />nicht qualifizierte Komponenten<ph name="LINK_END" /> erkannt. Wenn du deren Installation bestätigen möchtest, tu das bitte jetzt.</translation> <translation id="2363636958541445404">Aktiviere die Funktion, um die Bildschirmschoner-Optionen auszuwählen</translation> <translation id="2364498172489649528">Bestanden</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation> <translation id="3056720590588772262">Endpunkt</translation> <translation id="3069085583900247081">Fehler beim Test</translation> +<translation id="3076243757415932261">Komponenten werden überprüft…</translation> <translation id="3083667275341675831">Connectivity Diagnostics</translation> <translation id="3084958266922136097">Bildschirmschoner deaktivieren</translation> <translation id="3091839911843451378">Fehlgeschlagen – Angehalten</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Verbunden</translation> <translation id="3369013195428705271">Möchtest du den gesamten Druckverlauf wirklich löschen? Deine laufenden Druckaufträge werden nicht gelöscht.</translation> <translation id="3404249063913988450">Bildschirmschoner aktivieren</translation> +<translation id="3404770484521709967">Die Komponenten wurden richtig installiert.</translation> <translation id="3413935475507503304">Klicke zum Fortsetzen der Aktualisierung auf „Weiter“.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3435738964857648380">Sicherheit</translation> @@ -564,6 +568,7 @@ <translation id="6768237774506518020">Hohe Fehlerrate bei der DNS-Auflösung</translation> <translation id="680983167891198932">Schlüssel</translation> <translation id="6816797338148849397">Informationen in Bezug auf deine Auswahl sind verfügbar. Verwende für Zugriff den Aufwärtspfeil.</translation> +<translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> wird repariert</translation> <translation id="6853312040151791195">Entladestrom</translation> <translation id="6889786074662672253">Während des Neustarts darf dieses externe Gerät nicht getrennt oder der Computer heruntergefahren werden. Du kannst das Fenster aber minimieren. Der Vorgang kann einige Minuten dauern. Unter Umständen funktioniert dein externes Gerät während dieser Zeit nicht.</translation> <translation id="6905724422583748843">Zurück zu <ph name="PAGE_NAME" /></translation> @@ -672,6 +677,7 @@ <translation id="8045012663542226664">Mikrofon stummschalten</translation> <translation id="8075838845814659848">Akkustand</translation> <translation id="8082366717211101304">Auflösen des DNS von Android-Apps aus nicht möglich</translation> +<translation id="8083281199617904460">Dieser Reparaturvorgang muss von qualifiziertem Reparaturpersonal durchgeführt werden. Starte das Gerät erst, nachdem die fehlerhaften Komponenten ausgetauscht wurden.</translation> <translation id="808894953321890993">Passwort ändern</translation> <translation id="8104083085214006426">Du verwendest ein offenes und unsicheres Netzwerk</translation> <translation id="811820734797650957">(Android) Gateway kann kontaktiert werden</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index cd537c4..0f3024f 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Κατά την ενημέρωση του υλικολογισμικού, μην αποσυνδέσετε αυτήν την εξωτερική συσκευή και μην τερματίσετε τη λειτουργία του υπολογιστή. Μπορείτε να ελαχιστοποιήσετε αυτό το παράθυρο. Μπορεί να χρειαστούν λίγα λεπτά για αυτήν την ενημέρωση και η εξωτερική συσκευή σας μπορεί να μην λειτουργεί αυτό το διάστημα.</translation> <translation id="3486220673238053218">ορισμός</translation> <translation id="3488065109653206955">Μερικώς ενεργοποιημένο</translation> +<translation id="3517001332549868749">Ενημέρωση ChromeOS</translation> <translation id="3527036260304016759">Σφάλμα - Άγνωστο σφάλμα</translation> <translation id="3532980081107202182">Απομένουν περίπου <ph name="MIN_REMAINING" /> λεπτά</translation> <translation id="3557205324756024651">Τοπική ταυτότητα (προαιρετικό)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Λάβετε πληροφορίες σχετικά με την επιλογή σας.</translation> <translation id="6704062477274546131">Επίλυση DNS</translation> <translation id="6723839937902243910">Ενεργοποίηση</translation> +<translation id="6723847290197874913">Οπίσθιος φωτισμός πληκτρολογίου</translation> <translation id="672609503628871915">Δείτε τι νέο υπάρχει</translation> <translation id="6747215703636344499">Διακοπή - Ο δίσκος εξόδου είναι γεμάτος</translation> <translation id="6749473226660745022">Φωτογραφίες</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index eb60b14..a09074a 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -371,6 +371,7 @@ <translation id="4890353053343094602">Choose a new one immediately</translation> <translation id="4891842000192098784">Stress</translation> <translation id="4897058166682006107">Device has <ph name="BATTERY_PERCENTAGE" />% left bud battery.</translation> +<translation id="4915052247106771211">This will reset the device to factory settings (Powerwash).</translation> <translation id="4917385247580444890">Strong</translation> <translation id="4917889632206600977">Stopped – out of paper</translation> <translation id="4921665434385737356">Charged <ph name="RATE" /> in <ph name="NUM_SECONDS" /> seconds.</translation> @@ -425,6 +426,7 @@ <translation id="5358174242040570474">Something went wrong. Try choosing a wallpaper again or reopen the app.</translation> <translation id="5372659122375744710">Wi-Fi network is not secure</translation> <translation id="5376354385557966694">Automatic light mode</translation> +<translation id="537872351913703572">Device will go to a different user or organisation</translation> <translation id="5400907029458559844">Device is connecting.</translation> <translation id="5401938042319910061">Run all routines</translation> <translation id="5423849171846380976">Activated</translation> @@ -727,6 +729,7 @@ <translation id="8671972493856476349">Update to <ph name="VERSION_NUMBER" /> and restart</translation> <translation id="8675354002693747642">Pre-shared key</translation> <translation id="8677859815076891398">No albums. Create an album in <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> +<translation id="8680431479333800907">Device will go to the same user</translation> <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Use the left or right arrow keys to manage this feature.</translation> <translation id="8712637175834984815">Got it</translation> <translation id="871560550817059752">Failed – Out of ink</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 4a798394..1189d546 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Püsivara värskendamise ajal ärge seda välist seadet eemaldage ega arvutit välja lülitage. Võite selle akna minimeerida. Selle värskenduse lõpuleviimiseks võib kuluda mõni minut ja teie väline seade ei pruugi sel ajal töötada.</translation> <translation id="3486220673238053218">definitsioon</translation> <translation id="3488065109653206955">Osaliselt aktiveeritud</translation> +<translation id="3517001332549868749">Chrome OS-i värsken.</translation> <translation id="3527036260304016759">Ebaõnnestus – tundmatu viga</translation> <translation id="3532980081107202182">Jäänud on ligikaudu <ph name="MIN_REMAINING" /> minutit</translation> <translation id="3557205324756024651">Kohalik identiteet (valikuline)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Hankige oma valiku kohta teavet</translation> <translation id="6704062477274546131">DNS-lahendus</translation> <translation id="6723839937902243910">Toide</translation> +<translation id="6723847290197874913">Klaviatuuri taustavalgus</translation> <translation id="672609503628871915">Vaadake, mis on uut</translation> <translation id="6747215703636344499">Peatatud – väljastussalv on täis</translation> <translation id="6749473226660745022">Fotod</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb index d38484c..13e4fe9 100644 --- a/chromeos/strings/chromeos_strings_eu.xtb +++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Pantailaren distira jaisteko tekla</translation> <translation id="2104796393919810494">Osatu da konponketa</translation> <translation id="2105810540595158374">Gailua bideo-jokoen kontrolagailu bat da.</translation> +<translation id="2115956742084455574">Okerra da kodea</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, <ph name="MILESTONE_VERSION" /> bertsioa</translation> <translation id="2126937207024182736"><ph name="AVAILABLE_MEMORY" /> GB / <ph name="TOTAL_MEMORY" /> GB daude erabilgarri</translation> <translation id="2138109643290557664">Flotatu airean</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Inguruko gailuak ikusteko, aktibatu Bluetooth-a</translation> <translation id="2346474577291266260">Bikaina (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463"><ph name="LINK_BEGIN" />Osagai ez-bateragarriak<ph name="LINK_END" /> hauteman dira. Instalatuta daudela berretsiko baduzu, berrets ezazu orain bertan.</translation> <translation id="2363636958541445404">Aktibatu eginbidea pantaila-babeslearen aukerak hautatzeko</translation> <translation id="2364498172489649528">Gaindituta</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation> <translation id="3056720590588772262">Amaiera-puntua</translation> <translation id="3069085583900247081">Probak huts egin du</translation> +<translation id="3076243757415932261">Osagaiak baliozkotzen…</translation> <translation id="3083667275341675831">Konexio-diagnostikoak</translation> <translation id="3084958266922136097">Desgaitu pantaila-babeslea</translation> <translation id="3091839911843451378">Hutsegitea - Gelditu egin da</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Konektatuta</translation> <translation id="3369013195428705271">Ziur inprimatze-historia guztia garbitu nahi duzula? Ez dira garbituko abian dauden inprimatze-lanak.</translation> <translation id="3404249063913988450">Gaitu pantaila-babeslea</translation> +<translation id="3404770484521709967">Osagaiak behar bezala instalatuta daude.</translation> <translation id="3413935475507503304">Eguneratzeko, sakatu Hurrengoa.</translation> <translation id="3434107140712555581">% <ph name="BATTERY_PERCENTAGE" /></translation> <translation id="3435738964857648380">Segurtasuna</translation> @@ -564,6 +568,7 @@ <translation id="6768237774506518020">DNS bidezko ebazpenen hutsegite-tasa altua</translation> <translation id="680983167891198932">Gakoa</translation> <translation id="6816797338148849397">Eskuragarri dago zure hautapenari buruzko informazioa. Erabili gora egiteko gezi-tekla informazioa atzitzeko.</translation> +<translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> konpontzea</translation> <translation id="6853312040151791195">Bateriaren deskargatze-abiadura</translation> <translation id="6889786074662672253">Gailua eguneratu bitartean, ez deskonektatu kanpoko gailua edo ez itzali ordenagailua. Leihoa minimiza dezakezu. Agian minutu batzuk beharko dira eguneratzea instalatzeko, eta baliteke kanpoko gailuak denbora tarte horretan ez funtzionatzea.</translation> <translation id="6905724422583748843">Itzuli <ph name="PAGE_NAME" /> orrira</translation> @@ -672,6 +677,7 @@ <translation id="8045012663542226664">Mikrofonoa desaktibatzeko botoia</translation> <translation id="8075838845814659848">Geratzen den bateria</translation> <translation id="8082366717211101304">Ezin da ebatzi DNS Android-erako aplikazioetatik</translation> +<translation id="8083281199617904460">Konponketa-prozesu hau konponketak egiteko trebakuntza duen teknikari batentzat dago diseinatuta. Oker funtzionatzen duten osagaiak ordeztu ondoren abiarazi behar da prozesua.</translation> <translation id="808894953321890993">Aldatu pasahitza</translation> <translation id="8104083085214006426">Segurua ez den sare ireki bat ari zara erabiltzen</translation> <translation id="811820734797650957">Ping egin dakioke atebideari (Android)</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index fa961f5..d70452ba 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">وقتی سفتافزار درحال بهروزرسانی است، این دستگاه خارجی را جدا نکنید و رایانه را خاموش نکنید. میتوانید این پنجره را کمینه کنید. این بهروزرسانی ممکن است چند دقیقه طول بکشد و در این مدت ممکن است دستگاه خارجیتان کار نکند.</translation> <translation id="3486220673238053218">معنی</translation> <translation id="3488065109653206955">بهطور نسبی فعال شده است</translation> +<translation id="3517001332549868749">بهروزرسانی ChromeOS</translation> <translation id="3527036260304016759">انجام نشد - خطای نامشخص</translation> <translation id="3532980081107202182">تقریباً <ph name="MIN_REMAINING" /> دقیقه باقی مانده است</translation> <translation id="3557205324756024651">شناسه محلی (اختیاری)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">دریافت اطلاعاتی که با انتخابتان مرتبط است</translation> <translation id="6704062477274546131">وضوح ساناد</translation> <translation id="6723839937902243910">نیرو</translation> +<translation id="6723847290197874913">نور پسزمینه صفحهکلید</translation> <translation id="672609503628871915">مشاهده تازهها</translation> <translation id="6747215703636344499">متوقف شد - خروجی پُر است</translation> <translation id="6749473226660745022">Photos</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index 95866cd..72b1514 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Älä irrota ulkoista laitetta äläkä sammuta tietokonetta sillä aikaa kun laiteohjelmisto päivittyy. Voit pienentää ikkunan. Päivityksessä voi mennä muutama minuutti, eikä ulkoinen laite välttämättä toimi sen aikana.</translation> <translation id="3486220673238053218">määritelmä</translation> <translation id="3488065109653206955">Osittain aktivoitu</translation> +<translation id="3517001332549868749">ChromeOS-päivitys</translation> <translation id="3527036260304016759">Epäonnistui – Tuntematon virhe</translation> <translation id="3532980081107202182">Noin <ph name="MIN_REMAINING" /> minuuttia jäljellä</translation> <translation id="3557205324756024651">Paikallinen identiteetti (valinnainen)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Tietoja valinnastasi</translation> <translation id="6704062477274546131">DNS-ratkaisu</translation> <translation id="6723839937902243910">Virta</translation> +<translation id="6723847290197874913">Näppämistön taustavalo</translation> <translation id="672609503628871915">Uudet ominaisuudet</translation> <translation id="6747215703636344499">Pysähtynyt – Syöte täynnä</translation> <translation id="6749473226660745022">Kuvat</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index 20971825..4d34c66f 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Babaan ang liwanag ng display</translation> <translation id="2104796393919810494">Kumpleto na ang pag-repair</translation> <translation id="2105810540595158374">Game controller ang device.</translation> +<translation id="2115956742084455574">Maling code</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, bersyon <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="AVAILABLE_MEMORY" /> GB sa <ph name="TOTAL_MEMORY" /> GB ang available</translation> <translation id="2138109643290557664">Float on by</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">I-on ang Bluetooth upang tuklasin ang mga kalapit na device</translation> <translation id="2346474577291266260">Napakabilis (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">May na-detect na <ph name="LINK_BEGIN" />mga hindi kwalipikadong bahagi<ph name="LINK_END" />. Kung pipiliin mong kumpirmahin na na-install na ito, pakigawa ito ngayon.</translation> <translation id="2363636958541445404">I-on ang feature para pumili ng mga opsyon sa screensaver</translation> <translation id="2364498172489649528">Nakapasa</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation> <translation id="3056720590588772262">Endpoint</translation> <translation id="3069085583900247081">Nabigo ang pagsubok</translation> +<translation id="3076243757415932261">Vina-validate ang mga bahagi...</translation> <translation id="3083667275341675831">Mga Diagnostic sa Pagkakonekta</translation> <translation id="3084958266922136097">I-disable ang screen saver</translation> <translation id="3091839911843451378">Hindi na-print - Huminto</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Nakakonekta</translation> <translation id="3369013195428705271">Sigurado ka bang gusto mong i-clear ang lahat ng history ng pag-print? Hindi maki-clear ang iyong mga kasalukuyang pag-print.</translation> <translation id="3404249063913988450">I-enable ang screen saver</translation> +<translation id="3404770484521709967">Na-install nang tama ang mga bahagi.</translation> <translation id="3413935475507503304">Para magpatuloy sa update, i-click ang Susunod.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">Seguridad</translation> @@ -564,6 +568,7 @@ <translation id="6768237774506518020">Mataas na rate ng hindi naisagawang pagresolba sa DNS</translation> <translation id="680983167891198932">Key</translation> <translation id="6816797338148849397">Available ang impormasyong nauugnay sa iyong pinili. Gamitin ang Pataas na arrow key para ma-access.</translation> +<translation id="6840315122969944400">Pag-aayos ng <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">Rate ng Pag-discharge</translation> <translation id="6889786074662672253">Habang nagre-restart, huwag alisin sa pagkakasaksak ang external device na ito o i-shut down ang iyong computer. Puwede mong i-minimize ang window na ito. Posible itong abutin nang ilang minuto at posibleng hindi gumana ang iyong external device sa panahong ito.</translation> <translation id="6905724422583748843">Bumalik sa <ph name="PAGE_NAME" /></translation> @@ -672,6 +677,7 @@ <translation id="8045012663542226664">Pang-mute ng mikropono</translation> <translation id="8075838845814659848">Natitirang pag-charge</translation> <translation id="8082366717211101304">Hindi ma-resolve ang DNS mula sa mga Android app</translation> +<translation id="8083281199617904460">Nakalaan ang prosesong ito ng pag-aayos para sa sinanay na technician sa pag-aayos. Magsimula lang kapag napalitan na ang mga hindi gumaganang bahagi.</translation> <translation id="808894953321890993">Palitan ang password</translation> <translation id="8104083085214006426">Gumagamit ka ng bukas at hindi secure na network</translation> <translation id="811820734797650957">(Android) Puwedeng I-ping ang Gateway</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 7ff111f..f671ba5 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Vous ne devez pas débrancher cet appareil externe ni éteindre votre ordinateur pendant la mise à jour du micrologiciel. Vous pouvez réduire cette fenêtre. Cette mise à jour peut prendre quelques minutes, durant lesquelles le fonctionnement de l'appareil externe est compromis.</translation> <translation id="3486220673238053218">définition</translation> <translation id="3488065109653206955">Partiellement activé</translation> +<translation id="3517001332549868749">Mise à jour Chrome OS</translation> <translation id="3527036260304016759">Échec – Erreur inconnue</translation> <translation id="3532980081107202182">Environ <ph name="MIN_REMAINING" /> minutes restantes</translation> <translation id="3557205324756024651">Identité locale (facultatif)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Obtenir des informations sur votre sélection</translation> <translation id="6704062477274546131">Résolution DNS</translation> <translation id="6723839937902243910">Alimentation</translation> +<translation id="6723847290197874913">Rétroéclairage du clavier</translation> <translation id="672609503628871915">Voir les nouveautés</translation> <translation id="6747215703636344499">Tâche suspendue - Bac de sortie plein</translation> <translation id="6749473226660745022">Photos</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index 3cceaaa0..bb1ee35 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -109,7 +109,7 @@ <translation id="2008685064673031089">Busca principal</translation> <translation id="2016697457005847575">Probar os pasos para tentar solucionar o problema</translation> <translation id="202500043506723828">EID</translation> -<translation id="2080070583977670716">Máis configuracións</translation> +<translation id="2080070583977670716">Máis opcións de configuración</translation> <translation id="2085089206770112532">Reducir brillo da pantalla</translation> <translation id="2104796393919810494">Reparación completada</translation> <translation id="2105810540595158374">O dispositivo é un mando de xogos.</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 35a042f..c9e7a30d 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Smanjivanje svjetline zaslona</translation> <translation id="2104796393919810494">Popravak je dovršen</translation> <translation id="2105810540595158374">Uređaj je kontroler za videoigre.</translation> +<translation id="2115956742084455574">Netočan kôd</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, verzija <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736">Dostupno je <ph name="AVAILABLE_MEMORY" /> GB od <ph name="TOTAL_MEMORY" /> GB</translation> <translation id="2138109643290557664">Lelujanje</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Uključite Bluetooth da biste otkrili uređaje u blizini</translation> <translation id="2346474577291266260">Izvrstan (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">Otkrivene su <ph name="LINK_BEGIN" />nekvalificirane komponente<ph name="LINK_END" />. Ako želite potvrditi da su instalirane, učinite to odmah.</translation> <translation id="2363636958541445404">Uključite tu značajku da biste odabrali opcije čuvara zaslona</translation> <translation id="2364498172489649528">Uspješno</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation> <translation id="3056720590588772262">Završna točka</translation> <translation id="3069085583900247081">Test nije uspio</translation> +<translation id="3076243757415932261">Validacija komponenti...</translation> <translation id="3083667275341675831">Dijagnostika veze</translation> <translation id="3084958266922136097">Onemogućivanje čuvara zaslona</translation> <translation id="3091839911843451378">Nije uspjelo – zaustavljeno</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Spojeno</translation> <translation id="3369013195428705271">Jeste li sigurni da želite izbrisati svu povijest ispisa? Zadaci ispisa u tijeku neće se izbrisati.</translation> <translation id="3404249063913988450">Omogućivanje čuvara zaslona</translation> +<translation id="3404770484521709967">Komponente su instalirane točno.</translation> <translation id="3413935475507503304">Da biste nastavili s ažuriranjem, kliknite Dalje.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">Sigurnost</translation> @@ -566,6 +570,7 @@ <translation id="6768237774506518020">Visoka stopa neuspješnih razrješavanja DNS-a</translation> <translation id="680983167891198932">Ključ</translation> <translation id="6816797338148849397">Dostupne su informacije o vašem odabiru. Pristupite im pritiskom strelice prema gore.</translation> +<translation id="6840315122969944400">Popravak uređaja <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">Brzina pražnjenja</translation> <translation id="6889786074662672253">Prilikom ažuriranja nemojte iskopčavati ovaj vanjski uređaj niti isključivati računalo. Ovaj prozor možete minimizirati. To može potrajati nekoliko minuta i vaš vanjski uređaj tada možda neće funkcionirati.</translation> <translation id="6905724422583748843">Natrag na <ph name="PAGE_NAME" /></translation> @@ -674,6 +679,7 @@ <translation id="8045012663542226664">Mikrofon isključen</translation> <translation id="8075838845814659848">Preostala razina napunjenosti</translation> <translation id="8082366717211101304">Razrješavanje DNS-a iz Android aplikacija nije uspjelo</translation> +<translation id="8083281199617904460">Postupak popravka smiju vršiti samo obučeni tehničari. Pokrenite ga tek nakon zamjene neispravnih komponenti.</translation> <translation id="808894953321890993">Promjena zaporke</translation> <translation id="8104083085214006426">Upotrebljavate otvorenu i nesigurnu mrežu</translation> <translation id="811820734797650957">(Android) Pristupnik se može pingati</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index c2f3e977..d0cf361 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Kijelző fényerejének csökkentése</translation> <translation id="2104796393919810494">Javítás befejezve</translation> <translation id="2105810540595158374">Az eszköz egy kontroller.</translation> +<translation id="2115956742084455574">Hibás kód</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, verzió: <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="TOTAL_MEMORY" />/<ph name="AVAILABLE_MEMORY" /> GB áll rendelkezésre.</translation> <translation id="2138109643290557664">Lebegés</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Kapcsolja be a Bluetooth-t a közeli eszközök felfedezéséhez</translation> <translation id="2346474577291266260">Kiváló (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">A rendszer <ph name="LINK_BEGIN" />nem jóváhagyott összetevőket<ph name="LINK_END" /> észlelt. Ha meg szeretné erősíteni az összetevők telepítését, most tegye meg.</translation> <translation id="2363636958541445404">Kapcsolja be a funkciót a képernyőkímélő-beállítások kiválasztásához</translation> <translation id="2364498172489649528">Sikeres ellenőrzés</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation> <translation id="3056720590588772262">Befejező pont</translation> <translation id="3069085583900247081">Sikertelen teszt</translation> +<translation id="3076243757415932261">Összetevők ellenőrzése…</translation> <translation id="3083667275341675831">Connectivity Diagnostics</translation> <translation id="3084958266922136097">Képernyővédő letiltása</translation> <translation id="3091839911843451378">Sikertelen – Leállítva</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Kapcsolódva</translation> <translation id="3369013195428705271">Biztosan törli a nyomtatási előzményeket? A folyamatban lévő nyomtatási feladatok nem szakadnak meg.</translation> <translation id="3404249063913988450">Képernyővédő engedélyezése</translation> +<translation id="3404770484521709967">Az összetevők megfelelően vannak telepítve.</translation> <translation id="3413935475507503304">A frissítéssel való folytatáshoz kattintson a Tovább lehetőségre.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">Biztonság</translation> @@ -564,6 +568,7 @@ <translation id="6768237774506518020">Magas hibaarány DNS-feloldásnál</translation> <translation id="680983167891198932">Kulcs</translation> <translation id="6816797338148849397">Rendelkezésre áll információ a kiválasztott elemmel kapcsolatban. A felfelé nyíllal érheti el.</translation> +<translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> javítása</translation> <translation id="6853312040151791195">Lemerítési sebesség</translation> <translation id="6889786074662672253">Az újraindítás közben ne húzza ki a külső eszközt, és ne kapcsolja ki számítógépét. Ezt az ablakot kis méretre állíthatja. A folyamat eltarthat néhány percig, és előfordulhat, hogy közben nem működik a külső eszköz.</translation> <translation id="6905724422583748843">Vissza ide: <ph name="PAGE_NAME" /></translation> @@ -672,6 +677,7 @@ <translation id="8045012663542226664">Mikrofon némítása</translation> <translation id="8075838845814659848">Töltöttségi szint</translation> <translation id="8082366717211101304">Nem sikerült feloldani a DNS-t androidos alkalmazásokról</translation> +<translation id="8083281199617904460">A javítási folyamat elvégzését szakképzett szerelő számára tervezték. Csak a hibásan működő összetevők cseréje után indítsa el.</translation> <translation id="808894953321890993">Jelszó módosítása</translation> <translation id="8104083085214006426">Ön nyílt és nem biztonságos hálózatot használ</translation> <translation id="811820734797650957">(Android) Az átjáró pingelhető</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index d3b620e..9ce4a08 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Saat firmware sedang diupdate, jangan mencabut perangkat eksternal ini atau mematikan komputer. Anda dapat meminimalkan jendela ini. Update ini mungkin perlu waktu beberapa menit dan perangkat eksternal mungkin tidak berfungsi selama update.</translation> <translation id="3486220673238053218">definisi</translation> <translation id="3488065109653206955">Diaktifkan sebagian</translation> +<translation id="3517001332549868749">Update Chrome OS</translation> <translation id="3527036260304016759">Gagal - Error tidak diketahui</translation> <translation id="3532980081107202182">Sekitar <ph name="MIN_REMAINING" /> menit lagi</translation> <translation id="3557205324756024651">Identitas lokal (opsional)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Dapatkan info terkait pilihan Anda</translation> <translation id="6704062477274546131">Resolusi DNS</translation> <translation id="6723839937902243910">Daya</translation> +<translation id="6723847290197874913">Lampu latar keyboard</translation> <translation id="672609503628871915">Lihat apa saja yang baru</translation> <translation id="6747215703636344499">Dihentikan - Baki hasil cetak penuh</translation> <translation id="6749473226660745022">Foto</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index 76998dcc..53493b3 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">הפחתת הבהירות של התצוגה</translation> <translation id="2104796393919810494">התיקון הושלם</translation> <translation id="2105810540595158374">המכשיר הוא שלט לגיימינג.</translation> +<translation id="2115956742084455574">קוד שגוי</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, גרסה <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736">הנפח הזמין: GB<ph name="AVAILABLE_MEMORY" /> מתוך GB<ph name="TOTAL_MEMORY" /></translation> <translation id="2138109643290557664">צפים ונהנים</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">יש להפעיל את Bluetooth כדי לאתר מכשירים קרובים</translation> <translation id="2346474577291266260">מצוין (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">זוהו <ph name="LINK_BEGIN" />רכיבים לא מתאימים<ph name="LINK_END" />. אם ברצונך לאשר את ההתקנה שלהם, עליך לעשות זאת עכשיו.</translation> <translation id="2363636958541445404">צריך להפעיל את התכונה כדי לבחור אפשרויות לשומר המסך</translation> <translation id="2364498172489649528">הילד או הילדה עברו את הבדיקה בהצלחה</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801">mA<ph name="CURRENT_VALUE" /></translation> <translation id="3056720590588772262">נקודת קצה (endpoint)</translation> <translation id="3069085583900247081">הבדיקה נכשלה</translation> +<translation id="3076243757415932261">הרכיבים נבדקים…</translation> <translation id="3083667275341675831">אבחון קישוריות</translation> <translation id="3084958266922136097">השבתת שומר המסך</translation> <translation id="3091839911843451378">נכשלה – משימת ההדפסה הופסקה</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">מחובר</translation> <translation id="3369013195428705271">לנקות את כל היסטוריית ההדפסות? משימות ההדפסה הנוכחיות לא יימחקו.</translation> <translation id="3404249063913988450">הפעלת שומר המסך</translation> +<translation id="3404770484521709967">הרכיבים הותקנו כמו שצריך.</translation> <translation id="3413935475507503304">צריך ללחוץ על 'הבא' כדי להמשיך בעדכון.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">אבטחה</translation> @@ -564,6 +568,7 @@ <translation id="6768237774506518020">שיעור כישלון גבוה לנסיונות זיהוי DNS</translation> <translation id="680983167891198932">מקש</translation> <translation id="6816797338148849397">יש מידע בקשר לבחירה שלך. כדי לגשת אליו, יש להקיש על מקש החץ למעלה.</translation> +<translation id="6840315122969944400">תיקון של <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">שיעור הפריקה</translation> <translation id="6889786074662672253">במהלך ההפעלה מחדש אין לנתק את המכשיר החיצוני הזה או לכבות את המחשב. אפשר למזער את החלון הזה. הפעולה עשויה להימשך כמה דקות ויכול להיות שהמכשיר החיצוני לא יפעל בזמן הזה.</translation> <translation id="6905724422583748843">חזרה אל <ph name="PAGE_NAME" /></translation> @@ -672,6 +677,7 @@ <translation id="8045012663542226664">השתקת המיקרופון</translation> <translation id="8075838845814659848">אחוז הסוללה שנותר לטעון</translation> <translation id="8082366717211101304">לא ניתן ליצור רזולוציית DNS לאפליקציות ל-Android</translation> +<translation id="8083281199617904460">תהליך התיקון צריך להתבצע על ידי טכנאי מוסמך. יש להתחיל אותו רק אחרי שמחליפים את הרכיבים שאינם תקינים.</translation> <translation id="808894953321890993">שינוי הסיסמה</translation> <translation id="8104083085214006426">הרשת שאליה התחברת פתוחה ואינה מאובטחת</translation> <translation id="811820734797650957">אפשר לבדוק אם יש חיבור לשער באמצעות פינג (Android)</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index e0960bd..aa33db37 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">ეკრანის სიკაშკაშის დაკლება</translation> <translation id="2104796393919810494">შეკეთება დასრულდა</translation> <translation id="2105810540595158374">მოწყობილობა არის სათამაშო კონტროლერი.</translation> +<translation id="2115956742084455574">კოდი არასწორია</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, ვერსია <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736">ხელმისაწვდომია <ph name="TOTAL_MEMORY" /> გბაიტიდან <ph name="AVAILABLE_MEMORY" /> გბაიტი</translation> <translation id="2138109643290557664">ლივლივი</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">ახლომდებარე მოწყობილობების საპოვნელად ჩართეთ Bluetooth</translation> <translation id="2346474577291266260">შესანიშნავი (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">აღმოჩენილია <ph name="LINK_BEGIN" />კრიტერიუმებთან შეუსაბამო კომპონენტები<ph name="LINK_END" />. თუ გსურთ, დაადასტუროთ, რომ ეს დაინსტალირდა, გთხოვთ, ახლავე გააკეთოთ.</translation> <translation id="2363636958541445404">ეკრანმზოგის ვარიანტების ასარჩევად ჩართეთ ეს ფუნქცია</translation> <translation id="2364498172489649528">გავლილია</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> მა</translation> <translation id="3056720590588772262">საბოლოო წერტილი</translation> <translation id="3069085583900247081">ტესტი წარუმატებლად დასრულდა</translation> +<translation id="3076243757415932261">მიმდინარეობს კომპონენტების დადასტურება...</translation> <translation id="3083667275341675831">კავშირის დიაგნოსტიკა</translation> <translation id="3084958266922136097">ეკრანმზოგის გათიშვა</translation> <translation id="3091839911843451378">ვერ მოხერხდა — შეწყვიტა მუშაობა</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">დაკავშირებული</translation> <translation id="3369013195428705271">ნამდვილად გსურთ ბეჭდვის ისტორიის მთლიანად გასუფთავება? ბეჭდვის მიმდინარე დავალებები არ წაიშლება.</translation> <translation id="3404249063913988450">ეკრანმზოგის ჩართვა</translation> +<translation id="3404770484521709967">კომპონენტები სწორად დაინსტალირდა.</translation> <translation id="3413935475507503304">განახლების გასაგრძელებლად დაწკაპუნებით აირჩიეთ „შემდეგი“.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">უსაფრთხოება</translation> @@ -371,6 +375,7 @@ <translation id="4890353053343094602">დაუყოვნებლივ აირჩიეთ ახალი</translation> <translation id="4891842000192098784">სტრესი</translation> <translation id="4897058166682006107">მოწყობილობის მარცხენა ყურსაცვამის ბატარეის დონეა <ph name="BATTERY_PERCENTAGE" />%.</translation> +<translation id="4915052247106771211">ეს მოქმედება დააბრუნებს მოწყობილობას ქარხნული პარამეტრებზე (შესრულდება Powerwash).</translation> <translation id="4917385247580444890">ძლიერი</translation> <translation id="4917889632206600977">გაჩერდა — ქაღალდი გათავდა</translation> <translation id="4921665434385737356"><ph name="RATE" /> დაიტენა <ph name="NUM_SECONDS" /> წამში.</translation> @@ -425,6 +430,7 @@ <translation id="5358174242040570474">რაღაც შეცდომა მოხდა. ხელახლა ცადეთ ფონის არჩევა ან აპის გახსნა.</translation> <translation id="5372659122375744710">Wi-Fi ქსელი არ არის დაცული</translation> <translation id="5376354385557966694">ავტომატური ღია რეჟიმი</translation> +<translation id="537872351913703572">მოწყობილობას სხვა მომხმარებელი ან ორგანიზაცია მიიღებს</translation> <translation id="5400907029458559844">მოწყობილობა უკავშირდება.</translation> <translation id="5401938042319910061">ყველა რუტინის გაშვება</translation> <translation id="5423849171846380976">გააქტიურებულია</translation> @@ -566,6 +572,7 @@ <translation id="6768237774506518020">DNS-ის წარუმატებელი დარეგულირებების მაჩვენებელი მაღალია</translation> <translation id="680983167891198932">გასაღები</translation> <translation id="6816797338148849397">ხელმისაწვდომია თქვენს არჩევანთან დაკავშირებული ინფორმაცია. წვდომისთვის გამოიყენეთ კლავიში ზემოთ მიმართული ისრით.</translation> +<translation id="6840315122969944400"><ph name="DEVICE_TYPE" />-ის აღდგენა</translation> <translation id="6853312040151791195">განმუხტვის სიჩქარე</translation> <translation id="6889786074662672253">გადატვირთვის პროცესში არ გამოაერთოთ ეს გარე მოწყობილობა და არც კომპიუტერი გამორთოთ. შეგიძლიათ ამ ფანჯრის ჩაკეცვა. პროცესის დასრულებას შეიძლება რამდენიმე წუთი დასჭირდეს, რა დროსაც გარე მოწყობილობამ შეიძლება არ იმუშაოს.</translation> <translation id="6905724422583748843"><ph name="PAGE_NAME" />-ზე დაბრუნება</translation> @@ -674,6 +681,7 @@ <translation id="8045012663542226664">მიკროფონის დადუმება</translation> <translation id="8075838845814659848">დარჩენილი მუხტი</translation> <translation id="8082366717211101304">DNS-ის დარეგულირება ვერ მოხერხდა Android აპებიდან</translation> +<translation id="8083281199617904460">აღდგენის ეს პროცესი განკუთვნილია კვალიფიციური შემკეთებლებისთვის. დაიწყეთ მხოლოდ მას შემდეგ, რაც ჩაანაცვლებთ არასწორად მომუშავე კომპონენტებს.</translation> <translation id="808894953321890993">პაროლის შეცვლა</translation> <translation id="8104083085214006426">თქვენ ღია და არასტაბილური ქსელით სარგებლობთ</translation> <translation id="811820734797650957">(Android) გეითვეის ping-მეთოდით ტესტირება</translation> @@ -727,6 +735,7 @@ <translation id="8671972493856476349"><ph name="VERSION_NUMBER" />-მდე განახლება და გადატვირთვა</translation> <translation id="8675354002693747642">წინასწარ გაზიარებული გასაღები</translation> <translation id="8677859815076891398">ალბომები არ არის. შექმენით ალბომები <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />-ში.</translation> +<translation id="8680431479333800907">მოწყობილობას იგივე მომხმარებელი მიიღებს</translation> <translation id="8709616837707653427"><ph name="DESC_TEXT" /> ამ ფუნქციის სამართავად გამოიყენეთ კლავიშები მარცხნივ ან მარჯვნივ მიმართული ისრებით.</translation> <translation id="8712637175834984815">კარგი</translation> <translation id="871560550817059752">ვერ მოხერხდა — მელანი გაუთავდა</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index 9c2bc01c..106b09d5 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Микробағдарлама жаңартылып жатқанда, сыртқы құрылғыны ажыратпаңыз немесе компьютерді өшірмеңіз. Бұл терезені кішірейте аласыз. Бұл жаңарту бірнеше минутқа созылып, ол кезде сыртқы құрылғы жұмыс істемей қалуы мүмкін.</translation> <translation id="3486220673238053218">анықтама</translation> <translation id="3488065109653206955">Ішінара белсендірілген</translation> +<translation id="3517001332549868749">Chrome OS жаңарту</translation> <translation id="3527036260304016759">Сәтсіз: белгісіз қате шықты</translation> <translation id="3532980081107202182">Шамамен <ph name="MIN_REMAINING" /> минут қалды.</translation> <translation id="3557205324756024651">Жергілікті идентификация (қосымша)</translation> @@ -553,6 +554,7 @@ <translation id="6692996468359469499">Таңдауға қатысты ақпарат алу</translation> <translation id="6704062477274546131">DNS ажыратымдылығы</translation> <translation id="6723839937902243910">Күш</translation> +<translation id="6723847290197874913">Пернетақта жарығы</translation> <translation id="672609503628871915">Жаңалықтарды қарау</translation> <translation id="6747215703636344499">Тоқтатылды: шығыс науа толып кетті</translation> <translation id="6749473226660745022">Фотосуреттер</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 9659390..7240e683 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">디스플레이 밝기 낮추기</translation> <translation id="2104796393919810494">수리 완료됨</translation> <translation id="2105810540595158374">게임 컨트롤러 기기입니다.</translation> +<translation id="2115956742084455574">잘못된 코드</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, 버전 <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="TOTAL_MEMORY" />GB 중 <ph name="AVAILABLE_MEMORY" />GB를 사용할 수 있습니다.</translation> <translation id="2138109643290557664">바다에 누워</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" />dpi</translation> <translation id="2338501278241028356">블루투스를 사용 설정하여 근처 기기 탐색</translation> <translation id="2346474577291266260">우수(<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463"><ph name="LINK_BEGIN" />정규화되지 않은 구성요소<ph name="LINK_END" />가 감지되었습니다. 이 구성요소가 설치되었음을 확인하려면 지금 확인하세요.</translation> <translation id="2363636958541445404">화면 보호기 옵션을 선택하려면 기능을 사용 설정하세요.</translation> <translation id="2364498172489649528">통과</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation> <translation id="3056720590588772262">엔드포인트</translation> <translation id="3069085583900247081">테스트 실패</translation> +<translation id="3076243757415932261">구성요소 확인 중...</translation> <translation id="3083667275341675831">연결 진단</translation> <translation id="3084958266922136097">화면 보호기 사용 중지</translation> <translation id="3091839911843451378">실패 - 중지됨</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">연결됨</translation> <translation id="3369013195428705271">모든 인쇄 기록을 삭제하시겠습니까? 진행 중인 인쇄 작업은 삭제되지 않습니다.</translation> <translation id="3404249063913988450">화면 보호기 사용</translation> +<translation id="3404770484521709967">구성요소가 제대로 설치되었습니다.</translation> <translation id="3413935475507503304">업데이트를 계속하려면 다음을 클릭하세요.</translation> <translation id="3434107140712555581">배터리 <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">보안</translation> @@ -564,6 +568,7 @@ <translation id="6768237774506518020">DNS 변환 실패율 높음</translation> <translation id="680983167891198932">키</translation> <translation id="6816797338148849397">선택 항목과 관련된 정보를 이용할 수 있습니다. 액세스하려면 위쪽 화살표 키를 사용하세요.</translation> +<translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> 수리</translation> <translation id="6853312040151791195">방전 속도</translation> <translation id="6889786074662672253">다시 시작하는 동안 외부 기기를 분리하거나 컴퓨터를 종료하지 마세요. 이 창을 최소화할 수 있습니다. 다시 시작하는 데 몇 분 정도 걸릴 수 있으며 이 시간 동안 외부 기기가 작동하지 않을 수도 있습니다.</translation> <translation id="6905724422583748843"><ph name="PAGE_NAME" /> 페이지로 돌아가기</translation> @@ -672,6 +677,7 @@ <translation id="8045012663542226664">마이크 음소거</translation> <translation id="8075838845814659848">배터리 잔량</translation> <translation id="8082366717211101304">Android 앱에서 DNS를 변환할 수 없습니다.</translation> +<translation id="8083281199617904460">전문 기술자가 수리해야 합니다. 반드시 고장 난 구성요소를 교체한 후 시작하세요.</translation> <translation id="808894953321890993">비밀번호 변경</translation> <translation id="8104083085214006426">안전하지 않은 개방형 네트워크를 사용하고 있습니다.</translation> <translation id="811820734797650957">(Android) 핑할 수 있는 게이트웨이</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index 9132eea6..f3fa51fa 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">ຫຼຸດຄວາມສະຫວ່າງການສະແດງຜົນ</translation> <translation id="2104796393919810494">ສ້ອມແປງສຳເລັດແລ້ວ</translation> <translation id="2105810540595158374">ອຸປະກອນແມ່ນມືເກມ.</translation> +<translation id="2115956742084455574">ລະຫັດບໍ່ຖືກຕ້ອງ</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, ເວີຊັນ <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736">ຫວ່າງ <ph name="AVAILABLE_MEMORY" /> GB ຈາກທັງໝົດ <ph name="TOTAL_MEMORY" /> GB</translation> <translation id="2138109643290557664">ລ່ອງລອຍຜ່ານໄປ</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">ເປີດ Bluetooth ເພື່ອຊອກຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ</translation> <translation id="2346474577291266260">ດີເລີດ (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">ກວດພົບ <ph name="LINK_BEGIN" />ອົງປະກອບທີ່ບໍ່ຜ່ານເງື່ອນໄຂ<ph name="LINK_END" />. ຫາກທ່ານເລືອກທີ່ຈະຢືນຢັນວ່ານີ້ໄດ້ຮັບການຕິດຕັ້ງແລ້ວ, ກະລຸນາເຮັດຕອນນີ້.</translation> <translation id="2363636958541445404">ເປີດຄຸນສົມບັດເພື່ອເລືອກຕົວເລືອກພາບພັກໜ້າຈໍ</translation> <translation id="2364498172489649528">ຜ່ານແລ້ວ</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation> <translation id="3056720590588772262">ຈຸດສິ້ນສຸດ</translation> <translation id="3069085583900247081">ທົດສອບບໍ່ສຳເລັດ</translation> +<translation id="3076243757415932261">ກຳລັງກວດສອບອົງປະກອບ...</translation> <translation id="3083667275341675831">ການວິນິໄສການເຊື່ອມຕໍ່</translation> <translation id="3084958266922136097">ປິດການນຳໃຊ້ສກຣີນເຊັບເວີ</translation> <translation id="3091839911843451378">ບໍ່ສຳເລັດ, ຢຸດແລ້ວ</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">ເຊື່ອມຕໍ່ແລ້ວ</translation> <translation id="3369013195428705271">ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການລຶບປະຫວັດການພິມທັງໝົດ? ວຽກການພິມທີ່ພວມດຳເນີນຢູ່ຂອງທ່ານຈະບໍ່ຖືກລຶບລ້າງ.</translation> <translation id="3404249063913988450">ເປີດການນຳໃຊ້ສະກຣີນເຊັບເວີແລ້ວ</translation> +<translation id="3404770484521709967">ຕິດຕັ້ງອົງປະກອບຢ່າງຖືກຕ້ອງແລ້ວ.</translation> <translation id="3413935475507503304">ເພື່ອດຳເນີນການຕໍ່ກັບອັບເດດ, ໃຫ້ຄລິກຕໍ່ໄປ</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">ຄວາມປອດໄພ</translation> @@ -370,6 +374,7 @@ <translation id="4890353053343094602">ເລືອກລະຫັດຜ່ານໃໝ່ໃນທັນທີ</translation> <translation id="4891842000192098784">ປະສິດທິພາບເມື່ອເພີ່ມແຮງກົດດັນ</translation> <translation id="4897058166682006107">ອຸປະກອນມີແບັດເຕີຣີຫູຟັງຂ້າງຊ້າຍເຫຼືອ <ph name="BATTERY_PERCENTAGE" />%.</translation> +<translation id="4915052247106771211">ນີ້ຈະຣີເຊັດອຸປະກອນນີ້ໄປເປັນຄ່າຈາກໂຮງງານ (Powerwash).</translation> <translation id="4917385247580444890">ແຮງ</translation> <translation id="4917889632206600977">ຢຸດພິມ, ເຈ້ຍໝົດ</translation> <translation id="4921665434385737356">ສາກ <ph name="RATE" /> ໃນ <ph name="NUM_SECONDS" /> ວິນາທີ.</translation> @@ -424,6 +429,7 @@ <translation id="5358174242040570474">ມີບາງຢ່າງຜິດພາດເກີດຂຶ້ນ. ໃຫ້ລອງເລືອກຮູບພື້ນຫຼັງອີກເທື່ອໜຶ່ງ ຫຼື ເປີດແອັບຄືນໃໝ່.</translation> <translation id="5372659122375744710">ເຄືອຂ່າຍ WiFi ບໍ່ປອດໄພ</translation> <translation id="5376354385557966694">ໂໝດແຈ້ງອັດຕະໂນມັດ</translation> +<translation id="537872351913703572">ອຸປະກອນຈະສົ່ງໄປຫາຜູ້ໃຊ້ ຫຼື ອົງການອື່ນ</translation> <translation id="5400907029458559844">ອຸປະກອນກຳລັງເຊື່ອມຕໍ່ຢູ່.</translation> <translation id="5401938042319910061">ເອີ້ນໃຊ້ສິ່ງທີ່ເຮັດປະຈຳທັງໝົດ</translation> <translation id="5423849171846380976">ເປີດໃຊ້ງານແລ້ວ</translation> @@ -564,6 +570,7 @@ <translation id="6768237774506518020">ອັດຕາຄວາມບໍ່ສຳເລັດຂອງຄວາມລະອຽດ DNS ສູງ</translation> <translation id="680983167891198932">ກະແຈ</translation> <translation id="6816797338148849397">ມີຂໍ້ມູນທີ່ກ່ຽວຂ້ອງກັບການເລືອກຂອງທ່ານ. ໃຊ້ລູກສອນຂຶ້ນເພື່ອເຂົ້າເຖິງ.</translation> +<translation id="6840315122969944400">ສ້ອມແປງ <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">ອັດຕາການຄາຍປະຈຸ</translation> <translation id="6889786074662672253">ໃນລະຫວ່າງທີ່ກຳລັງຣີສະຕາດ, ກະລຸນາຢ່າຖອດປລັກອຸປະກອນພາຍນອກນີ້ ຫຼື ປິດເຄື່ອງຄອມພິວເຕີຂອງທ່ານ. ທ່ານສາມາດຫຍໍ້ໜ້າຈໍນີ້ລົງໄດ້. ຂັ້ນຕອນນີ້ອາດໃຊ້ເວລາສອງສາມນາທີ ແລະ ອຸປະກອນພາຍນອກຂອງທ່ານອາດບໍ່ເຮັດວຽກໃນລະຫວ່າງນີ້.</translation> <translation id="6905724422583748843">ກັບໄປ <ph name="PAGE_NAME" /></translation> @@ -673,6 +680,7 @@ <translation id="8045012663542226664">ປິດສຽງໄມໂຄຣໂຟນ</translation> <translation id="8075838845814659848">ການສາກທີ່ເຫຼືອ</translation> <translation id="8082366717211101304">ບໍ່ສາມາດລະບຸ DNS ຈາກແອັບ Android ໄດ້</translation> +<translation id="8083281199617904460">ຂັ້ນຕອນການສ້ອມແປງນີ້ແມ່ນສຳລັບຊ່າງສ້ອມແປງທີ່ໄດ້ຮັບການເຝິກມາແລ້ວ. ໃຫ້ເລີ່ມສະເພາະຫຼັງຈາກການປ່ຽນອົງປະກອບທີ່ເສຍຫາຍເທົ່ານັ້ນ.</translation> <translation id="808894953321890993">ປ່ຽນລະຫັດຜ່ານ</translation> <translation id="8104083085214006426">ທ່ານກຳລັງໃຊ້ເຄືອຂ່າຍເປີດ ແລະ ບໍ່ປອດໄພຢູ່</translation> <translation id="811820734797650957">(Android) ສາມາດ Ping ເກດເວໄດ້</translation> @@ -726,6 +734,7 @@ <translation id="8671972493856476349">ອັບເດດເປັນ <ph name="VERSION_NUMBER" /> ແລ້ວຣີສະຕາດ</translation> <translation id="8675354002693747642">ລະຫັດທີ່ແບ່ງປັນລ່ວງໜ້າ</translation> <translation id="8677859815076891398">ບໍ່ມີອະລະບ້ຳ. ສ້າງອະລະບໍ້າໃນ <ph name="LINK_BEGIN" />Google ຮູບພາບ<ph name="LINK_END" />.</translation> +<translation id="8680431479333800907">ອຸປະກອນຈະສົ່ງໄປຫາຜູ້ໃຊ້ດຽວກັນ</translation> <translation id="8709616837707653427"><ph name="DESC_TEXT" /> ໃຊ້ປຸ່ມລູກສອນຊ້າຍ ຫຼື ຂວາເພື່ອຈັດການຄຸນສົມບັດນີ້.</translation> <translation id="8712637175834984815">ເຂົ້າໃຈແລ້ວ</translation> <translation id="871560550817059752">ບໍ່ສຳເລັດ, ນໍ້າໝຶກໝົດ</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index 9b108236..5379f5a 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Kol programinė aparatinė įranga atnaujinama, neatjunkite išorinio įrenginio ir neišjunkite kompiuterio. Galite sumažinti šį langą. Šis atnaujinimo procesas gali užtrukti kelias minutes ir tuo metu jūsų išorinis įrenginys gali neveikti.</translation> <translation id="3486220673238053218">apibrėžimas</translation> <translation id="3488065109653206955">Iš dalies suaktyvinta</translation> +<translation id="3517001332549868749">„Chrome“ OS naujinys</translation> <translation id="3527036260304016759">Nepavyko – nežinoma klaida</translation> <translation id="3532980081107202182">Liko apie <ph name="MIN_REMAINING" /> min.</translation> <translation id="3557205324756024651">Vietinio ryšio tapatybė (pasirenkama)</translation> @@ -370,6 +371,7 @@ <translation id="4890353053343094602">Nedelsdami pasirinkite naują</translation> <translation id="4891842000192098784">Įtampa</translation> <translation id="4897058166682006107">Įrenginio kairiosios ausinės akumuliatoriaus energijos lygis: <ph name="BATTERY_PERCENTAGE" /> proc.</translation> +<translation id="4915052247106771211">Bus atkurti gamykliniai įrenginio nustatymai („Powerwash“).</translation> <translation id="4917385247580444890">Stiprus</translation> <translation id="4917889632206600977">Sustabdyta – baigėsi popierius</translation> <translation id="4921665434385737356">Įkrauta: <ph name="RATE" /> per <ph name="NUM_SECONDS" /> sek.</translation> @@ -424,6 +426,7 @@ <translation id="5358174242040570474">Kažkas ne taip. Pabandykite pasirinkti ekrano foną dar kartą arba atidaryti programą iš naujo.</translation> <translation id="5372659122375744710">„Wi-Fi“ tinklas nesaugus</translation> <translation id="5376354385557966694">Automatinis šviesus režimas</translation> +<translation id="537872351913703572">Įrenginys bus perduotas kitam naudotojui ar organizacijai</translation> <translation id="5400907029458559844">Prijungiamas įrenginys.</translation> <translation id="5401938042319910061">Vykdyti visas veiksmų sekas</translation> <translation id="5423849171846380976">Suaktyvinta</translation> @@ -554,6 +557,7 @@ <translation id="6692996468359469499">Su pasirinkimu susijusios informacijos gavimas</translation> <translation id="6704062477274546131">DNS pavadinimų vertimas</translation> <translation id="6723839937902243910">Maitinimas</translation> +<translation id="6723847290197874913">Klaviatūros foninis apšvietimas</translation> <translation id="672609503628871915">Sužinokite, kas naujo</translation> <translation id="6747215703636344499">Sustabdyta – išvestis pilna</translation> <translation id="6749473226660745022">Nuotraukos</translation> @@ -725,6 +729,7 @@ <translation id="8671972493856476349">Atnaujinti į <ph name="VERSION_NUMBER" /> versiją ir paleisti iš naujo</translation> <translation id="8675354002693747642">Paruoštas bendrinti raktas</translation> <translation id="8677859815076891398">Nėra albumų. Sukurkite albumą <ph name="LINK_BEGIN" />„Google“ nuotraukose<ph name="LINK_END" />.</translation> +<translation id="8680431479333800907">Įrenginys bus perduotas tam pačiam naudotojui</translation> <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Šią funkciją galite valdyti rodyklės kairėn ar dešinėn klavišais.</translation> <translation id="8712637175834984815">Supratau</translation> <translation id="871560550817059752">Nepavyko – baigėsi rašalas</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index 9755c855..fe1f338 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Осветленоста на екранот се намали</translation> <translation id="2104796393919810494">Поправката е завршена</translation> <translation id="2105810540595158374">Уредот е контролер на игра.</translation> +<translation id="2115956742084455574">Неточен код</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, верзија <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736">Достапно: <ph name="AVAILABLE_MEMORY" /> GB од <ph name="TOTAL_MEMORY" /> GB</translation> <translation id="2138109643290557664">Лебдете наоколу</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Вклучете Bluetooth за да откриете места во близина</translation> <translation id="2346474577291266260">Одличен (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">Откриени се <ph name="LINK_BEGIN" />неквалификувани компоненти<ph name="LINK_END" />. Ако решите да потврдите дека се инсталирани, тогаш потврдете сега.</translation> <translation id="2363636958541445404">Вклучете ја функцијата за да одберете опции за заштитник на екран</translation> <translation id="2364498172489649528">Помина</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation> <translation id="3056720590588772262">Крајна точка</translation> <translation id="3069085583900247081">Тестот не успеа</translation> +<translation id="3076243757415932261">Компонентите се потврдуваат…</translation> <translation id="3083667275341675831">Дијагностика на поврзливоста</translation> <translation id="3084958266922136097">Оневозможете го заштитникот на екранот</translation> <translation id="3091839911843451378">Неуспешно - запрено</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Поврзано</translation> <translation id="3369013195428705271">Дали сте сигурни дека сакате да ја исчистите сета историја на печатење? Тековните задачи за печатење нема да бидат избришани.</translation> <translation id="3404249063913988450">Овозможете го заштитникот на екранот</translation> +<translation id="3404770484521709967">Компонентите се инсталирани правилно.</translation> <translation id="3413935475507503304">За да продолжите со ажурирањето, кликнете „Следно“.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">Безбедност</translation> @@ -566,6 +570,7 @@ <translation id="6768237774506518020">Висока стапка на неуспех на одредување со DNS</translation> <translation id="680983167891198932">Клуч</translation> <translation id="6816797338148849397">Достапни се информации поврзани со вашиот избор. Користете го копчето со стрелка нагоре за да пристапите.</translation> +<translation id="6840315122969944400">Поправи <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">Брзина на празнење</translation> <translation id="6889786074662672253">Додека се рестартира, не исклучувајте го надворешниов уред од струја или не исклучувајте го компјутерот. Може да го минимизирате прозорецов. Ова може да потрае неколку минути и надворешниот уред можеби нема да работи во ова време.</translation> <translation id="6905724422583748843">Назад на <ph name="PAGE_NAME" /></translation> @@ -674,6 +679,7 @@ <translation id="8045012663542226664">Исклучи звук на микрофон</translation> <translation id="8075838845814659848">Преостанато полнење</translation> <translation id="8082366717211101304">Не може да се одреди со DNS од апликации на Android</translation> +<translation id="8083281199617904460">Процесов на поправање е наменет за обучен техничар за поправки. Започнете само по замена на дефектните компоненти.</translation> <translation id="808894953321890993">Промени лозинка</translation> <translation id="8104083085214006426">Користите отворена и небезбедна мрежа</translation> <translation id="811820734797650957">(Android) Може да се испрати пинг до порталот</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb index 11a6ec89..774cf43 100644 --- a/chromeos/strings/chromeos_strings_mn.xtb +++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Дэлгэцийн гэрэлтүүлгийг багасгах</translation> <translation id="2104796393919810494">Засвар дууссан</translation> <translation id="2105810540595158374">Төхөөрөмж нь тоглоомын гар байна.</translation> +<translation id="2115956742084455574">Буруу код</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, <ph name="MILESTONE_VERSION" />-р хувилбар</translation> <translation id="2126937207024182736"><ph name="TOTAL_MEMORY" /> ГБ-аас <ph name="AVAILABLE_MEMORY" /> ГБ боломжтой</translation> <translation id="2138109643290557664">Хажуугаар хөвөх</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Ойролцоох төхөөрөмж хайхын тулд Bluetooth-г асаана уу</translation> <translation id="2346474577291266260">Маш сайн (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463"><ph name="LINK_BEGIN" />Шаардлага хангаагүй бүрэлдэхүүн хэсгүүд<ph name="LINK_END" /> илэрлээ. Хэрэв та үүнийг суулгасан болохыг баталгаажуулахаар сонгосон бол одоо хийнэ үү.</translation> <translation id="2363636958541445404">Дэлгэц амраагчийн сонголтыг сонгохын тулд онцлогийг асаана уу</translation> <translation id="2364498172489649528">Давсан</translation> <translation id="2380886658946992094">Хууль ёсны</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />мA</translation> <translation id="3056720590588772262">Төгсгөлийн цэг</translation> <translation id="3069085583900247081">Туршилт амжилтгүй боллоо</translation> +<translation id="3076243757415932261">Бүрэлдэхүүн хэсгүүдийг баталгаажуулж байна...</translation> <translation id="3083667275341675831">Холболтын оношилгоо</translation> <translation id="3084958266922136097">Дэлгэц амраагчийг идэвхгүй болгох</translation> <translation id="3091839911843451378">Амжилтгүй болсон - Зогссон</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Холбогдсон</translation> <translation id="3369013195428705271">Та хэвлэлийн бүх түүхийг арилгахдаа итгэлтэй байна уу? Таны хийж буй хэвлэлийн ажлуудыг арилгахгүй.</translation> <translation id="3404249063913988450">Дэлгэц амраагчийг идэвхжүүлэх</translation> +<translation id="3404770484521709967">Бүрэлдэхүүн хэсгүүдийг зөв суулгасан.</translation> <translation id="3413935475507503304">Шинэчлэлтийг үргэлжлүүлэхийн тулд Дараах дээр товшино уу.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">Нууцлал</translation> @@ -229,6 +233,7 @@ <translation id="3484914941826596830">Жижиг программыг шинэчилж байх үед энэ гадны төхөөрөмжийг бүү салгаарай. Мөн компьютероо бүү унтраагаарай. Та энэ цонхыг багасгах боломжтой. Энэ шинэчлэлтэд хэдэн минут зарцуулж магадгүй бөгөөд энэ хугацаанд таны гадны төхөөрөмж ажиллахгүй байж магадгүй.</translation> <translation id="3486220673238053218">тодорхойлолт</translation> <translation id="3488065109653206955">Хагас идэвхжсэн</translation> +<translation id="3517001332549868749">ChromeOS-н шинэчлэлт</translation> <translation id="3527036260304016759">Амжилтгүй болсон - Үл мэдэгдэх алдаа</translation> <translation id="3532980081107202182"><ph name="MIN_REMAINING" /> орчим минут үлдсэн байна</translation> <translation id="3557205324756024651">Дотоод таниулбар (заавал биш)</translation> @@ -370,6 +375,7 @@ <translation id="4890353053343094602">Нэн даруй шинийг сонгоно уу</translation> <translation id="4891842000192098784">Стресс</translation> <translation id="4897058166682006107">Төхөөрөмжийн зүүн талын чихэвчийн батарей <ph name="BATTERY_PERCENTAGE" />% байна.</translation> +<translation id="4915052247106771211">Энэ нь төхөөрөмжийг үйлдвэрийн тохиргоонд шинэчлэх болно (Powerwash).</translation> <translation id="4917385247580444890">Хүчтэй</translation> <translation id="4917889632206600977">Зогссон - Цаас дууссан</translation> <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> секундэд <ph name="RATE" /> цэнэглэсэн.</translation> @@ -424,6 +430,7 @@ <translation id="5358174242040570474">Алдаа гарлаа. Дэлгэцийн зураг дахин сонгох эсвэл аппыг дахин нээж үзнэ үү.</translation> <translation id="5372659122375744710">Wi-Fi сүлжээ аюулгүй биш байна</translation> <translation id="5376354385557966694">Автомат гэрэлтэй горим</translation> +<translation id="537872351913703572">Төхөөрөмж өөр хэрэглэгч эсвэл байгууллага руу очих болно</translation> <translation id="5400907029458559844">Төхөөрөмж холбогдож байна.</translation> <translation id="5401938042319910061">Бүх хэвшлийг ажиллуулах</translation> <translation id="5423849171846380976">Идэвхжүүлсэн байна</translation> @@ -554,6 +561,7 @@ <translation id="6692996468359469499">Сонголттойгоо холбоотой мэдээлэл авах</translation> <translation id="6704062477274546131">DNS-н тайлал</translation> <translation id="6723839937902243910">Эрчим хүч</translation> +<translation id="6723847290197874913">Гарын дэвсгэр өнгө</translation> <translation id="672609503628871915">Шинэ зүйл юу байна?</translation> <translation id="6747215703636344499">Зогссон - Гаралт дүүрсэн</translation> <translation id="6749473226660745022">Зураг</translation> @@ -564,6 +572,7 @@ <translation id="6768237774506518020">DNS-н тайллын алдааны өндөр хувь</translation> <translation id="680983167891198932">Түлхүүр</translation> <translation id="6816797338148849397">Таны сонголттой холбоотой мэдээлэл боломжтой байна. Хандахын тулд Дээш суман товчийг ашиглана уу.</translation> +<translation id="6840315122969944400"><ph name="DEVICE_TYPE" />-н засвар</translation> <translation id="6853312040151791195">Цэнэггүй болох хурд</translation> <translation id="6889786074662672253">Дахин эхлүүлэх үед энэ гадаад төхөөрөмжийг бүү салгаарай. Мөн компьютероо бүү унтраагаарай. Та энэ цонхыг багасгах боломжтой. Үүнд хэдэн минут зарцуулж магадгүй бөгөөд энэ хугацаанд таны гадаад төхөөрөмж ажиллахгүй байж магадгүй.</translation> <translation id="6905724422583748843"><ph name="PAGE_NAME" /> руу буцах</translation> @@ -672,6 +681,7 @@ <translation id="8045012663542226664">Микрофоны дууг хаах</translation> <translation id="8075838845814659848">Үлдсэн цэнэг</translation> <translation id="8082366717211101304">Android аппуудаас DNS-г шийдвэрлэх боломжгүй</translation> +<translation id="8083281199617904460">Энэ засварын явц нь бэлтгэгдсэн засварын техникчид зориулагдсан. Зөвхөн гэмтэлтэй бүрэлдэхүүн хэсгүүдийг сольсныхоо дараа эхэлнэ үү.</translation> <translation id="808894953321890993">Нууц үгийг солих</translation> <translation id="8104083085214006426">Та нээлттэй бөгөөд найдваргүй сүлжээ ашиглаж байна</translation> <translation id="811820734797650957">(Android) Гэйтвэй рүү пин илгээх боломжтой</translation> @@ -725,6 +735,7 @@ <translation id="8671972493856476349"><ph name="VERSION_NUMBER" /> руу шинэчилж, дахин эхлүүлэх</translation> <translation id="8675354002693747642">Урьдчилан хуваалцсан түлхүүр</translation> <translation id="8677859815076891398">Цомог байхгүй. <ph name="LINK_BEGIN" />Google Зурагт<ph name="LINK_END" /> цомог үүсгэнэ үү.</translation> +<translation id="8680431479333800907">Төхөөрөмж ижил хэрэглэгч рүү очих болно</translation> <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Энэ онцлогийг удирдахын тулд Зүүн эсвэл Баруун суман товчийг ашиглана уу.</translation> <translation id="8712637175834984815">Ойлголоо</translation> <translation id="871560550817059752">Амжилтгүй болсон - Бэх дууссан</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index aa0ad2e..ad1789f 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Koppel dit externe apparaat niet los en zet je computer niet uit terwijl de firmware wordt geüpdatet. Je kunt dit venster minimaliseren. Deze update kan een paar minuten duren en je externe apparaat werkt misschien niet tijdens het updaten.</translation> <translation id="3486220673238053218">definitie</translation> <translation id="3488065109653206955">Gedeeltelijk geactiveerd</translation> +<translation id="3517001332549868749">Chrome OS-update</translation> <translation id="3527036260304016759">Mislukt - Onbekende fout</translation> <translation id="3532980081107202182">Nog ongeveer <ph name="MIN_REMAINING" /> minuten</translation> <translation id="3557205324756024651">Lokale identiteit (optioneel)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Informatie over je selectie bekijken</translation> <translation id="6704062477274546131">DNS-resolutie</translation> <translation id="6723839937902243910">Voeding</translation> +<translation id="6723847290197874913">Achtergrondverlichting toetsenbord</translation> <translation id="672609503628871915">Wat is er nieuw?</translation> <translation id="6747215703636344499">Gestopt: uitvoer is vol</translation> <translation id="6749473226660745022">Foto's</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index 7aad68650..d31ea36 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">ਫ਼ਰਮਵੇਅਰ ਦੇ ਅੱਪਡੇਟ ਹੋਣ ਦੌਰਾਨ ਇਸ ਬਾਹਰੀ ਡੀਵਾਈਸ ਨੂੰ ਅਣਪਲੱਗ ਨਾ ਕਰੋ ਜਾਂ ਆਪਣੇ ਕੰਪਿਊਟਰ ਨੂੰ ਬੰਦ ਨਾ ਕਰੋ। ਤੁਸੀਂ ਇਸ ਵਿੰਡੋ ਨੂੰ ਛੋਟਾ ਕਰ ਸਕਦੇ ਹੋ। ਇਸ ਅੱਪਡੇਟ ਵਿੱਚ ਕੁਝ ਮਿੰਟ ਲੱਗ ਸਕਦੇ ਹਨ ਅਤੇ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਸਮੇਂ ਦੌਰਾਨ ਤੁਹਾਡਾ ਬਾਹਰੀ ਡੀਵਾਈਸ ਕੰਮ ਨਾ ਕਰੇ।</translation> <translation id="3486220673238053218">ਪਰਿਭਾਸ਼ਾ</translation> <translation id="3488065109653206955">ਅੰਸ਼ਕ ਤੌਰ ਤੇ ਸਕਿਰਿਆ ਕੀਤਾ</translation> +<translation id="3517001332549868749">ChromeOS ਸੰਬੰਧੀ ਅੱਪਡੇਟ</translation> <translation id="3527036260304016759">ਅਸਫਲ ਰਹੀ - ਅਗਿਆਤ ਗੜਬੜ</translation> <translation id="3532980081107202182">ਲਗਭਗ <ph name="MIN_REMAINING" /> ਮਿੰਟ ਬਾਕੀ</translation> <translation id="3557205324756024651">ਸਥਾਨਕ ਪਛਾਣ (ਵਿਕਲਪਿਕ)</translation> @@ -553,6 +554,7 @@ <translation id="6692996468359469499">ਆਪਣੀ ਚੋਣ ਨਾਲ ਸੰਬੰਧਿਤ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="6704062477274546131">DNS ਰੈਜ਼ੋਲਿਊਸ਼ਨ</translation> <translation id="6723839937902243910">ਪਾਵਰ</translation> +<translation id="6723847290197874913">ਕੀ-ਬੋਰਡ ਬੈਕਲਾਈਟ</translation> <translation id="672609503628871915">ਦੇਖੋ ਕਿ ਕੀ ਨਵਾਂ ਹੈ</translation> <translation id="6747215703636344499">ਬੰਦ ਹੋ ਗਿਆ - ਆਊਟਪੁੱਟ ਭਰ ਗਿਆ ਹੈ</translation> <translation id="6749473226660745022">ਫ਼ੋਟੋਆਂ</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index b799253..9a0e4d0 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Podczas aktualizowania oprogramowania układowego nie odłączaj tego urządzenia zewnętrznego ani nie wyłączaj komputera. To okno możesz zminimalizować. Aktualizowanie może potrwać kilka minut i w tym czasie urządzenie zewnętrzne może nie działać.</translation> <translation id="3486220673238053218">definicja</translation> <translation id="3488065109653206955">Częściowo aktywowane</translation> +<translation id="3517001332549868749">Aktualizacja Chrome OS</translation> <translation id="3527036260304016759">Niepowodzenie – nieznany błąd</translation> <translation id="3532980081107202182">Pozostało około <ph name="MIN_REMAINING" /> min</translation> <translation id="3557205324756024651">Tożsamość lokalna (opcjonalnie)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Uzyskiwanie informacji związanych z zaznaczoną treścią</translation> <translation id="6704062477274546131">Rozwiązywanie nazw DNS</translation> <translation id="6723839937902243910">Zasilanie</translation> +<translation id="6723847290197874913">Podświetlenie klawiatury</translation> <translation id="672609503628871915">Zobacz, co nowego</translation> <translation id="6747215703636344499">Zatrzymano – odbiornik papieru jest pełny</translation> <translation id="6749473226660745022">Zdjęcia</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index 3aaf4e43..04f89eb 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">Diminuir o brilho da tela</translation> <translation id="2104796393919810494">Reparo concluído</translation> <translation id="2105810540595158374">Este dispositivo é um controle de jogo.</translation> +<translation id="2115956742084455574">Código incorreto</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, versão <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="AVAILABLE_MEMORY" /> GB de <ph name="TOTAL_MEMORY" /> GB disponíveis</translation> <translation id="2138109643290557664">Flutue</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Ativar o Bluetooth para descobrir dispositivos nas proximidades</translation> <translation id="2346474577291266260">Excelente (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463"><ph name="LINK_BEGIN" />Componentes não qualificados<ph name="LINK_END" /> detectados. Se quiser confirmar a instalação, faça isso agora.</translation> <translation id="2363636958541445404">Ative o recurso para selecionar opções de protetor de tela</translation> <translation id="2364498172489649528">Aprovado</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation> <translation id="3056720590588772262">Endpoint</translation> <translation id="3069085583900247081">Falha no teste</translation> +<translation id="3076243757415932261">Validando componentes…</translation> <translation id="3083667275341675831">Diagnósticos de conectividade</translation> <translation id="3084958266922136097">Desativar o protetor de tela</translation> <translation id="3091839911843451378">Falha - Ação interrompida</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">Conectado</translation> <translation id="3369013195428705271">Tem certeza de que quer limpar todo o histórico? Os trabalhos de impressão atuais não serão apagados.</translation> <translation id="3404249063913988450">Ativar o protetor de tela</translation> +<translation id="3404770484521709967">Os componentes foram instalados corretamente.</translation> <translation id="3413935475507503304">Para continuar com a atualização, clique em "Próxima".</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">Segurança</translation> @@ -566,6 +570,7 @@ <translation id="6768237774506518020">Taxa elevada de erro de resolução de DNS</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="6840315122969944400">Reparo do <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">Taxa de descarregamento</translation> <translation id="6889786074662672253">Durante a reinicialização deste dispositivo externo, não o desconecte nem desligue o computador. Você pode minimizar esta janela. Isso pode levar alguns minutos, e o dispositivo externo pode não funcionar nesse período.</translation> <translation id="6905724422583748843">Voltar para <ph name="PAGE_NAME" /></translation> @@ -674,6 +679,7 @@ <translation id="8045012663542226664">Desativar o microfone</translation> <translation id="8075838845814659848">Carga restante</translation> <translation id="8082366717211101304">Não foi possível resolver o DNS em apps Android</translation> +<translation id="8083281199617904460">Este processo de reparo precisa ser feito por um técnico treinado. Só comece depois de substituir os componentes com problemas.</translation> <translation id="808894953321890993">Alterar senha</translation> <translation id="8104083085214006426">Você está usando uma rede aberta e não segura</translation> <translation id="811820734797650957">(Android) O gateway pode receber um ping</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index 9562c5f9..f881a53f 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Пока выполняется обновление встроенного ПО, не отключайте внешнее устройство и не выключайте компьютер. Это окно можно свернуть. Обновление займет несколько минут, в течение которых внешнее устройство может не работать.</translation> <translation id="3486220673238053218">узнать определение</translation> <translation id="3488065109653206955">Частично активировано</translation> +<translation id="3517001332549868749">Обновление Chrome OS</translation> <translation id="3527036260304016759">Сбой: неизвестная ошибка</translation> <translation id="3532980081107202182">Осталось примерно <ph name="MIN_REMAINING" /> мин.</translation> <translation id="3557205324756024651">Локальное удостоверение (необязательно)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Получайте информацию об объектах на экране</translation> <translation id="6704062477274546131">Разрешение DNS</translation> <translation id="6723839937902243910">Питание</translation> +<translation id="6723847290197874913">Подсветка клавиатуры</translation> <translation id="672609503628871915">Узнать, что нового</translation> <translation id="6747215703636344499">Печать прервана: выходной лоток заполнен</translation> <translation id="6749473226660745022">Фото</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb index 5c17bf4..45eca28 100644 --- a/chromeos/strings/chromeos_strings_si.xtb +++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">නිත්ය මෘදුකාංග යාවත්කාලීන වන අතරතුර, මෙම බාහිර උපාංගය විසන්ධි කිරීම හෝ ඔබගේ පරිගණකය වැසීම නොකරන්න. ඔබට මෙම කවුළුව කුඩා කළ හැකිය. මෙම යාවත්කාලීන කිරීමට මිනිත්තු කිහිපයක් ගත විය හැකි අතර මෙම කාලය තුළ ඔබගේ බාහිර උපාංගය ක්රියා නොකළ හැකිය.</translation> <translation id="3486220673238053218">නිර්වචනය</translation> <translation id="3488065109653206955">අර්ධව සක්රිය කළ</translation> +<translation id="3517001332549868749">ChromeOS යාවත්කාලීනය</translation> <translation id="3527036260304016759">අසාර්ථක විය - නොදන්නා දෝෂයකි</translation> <translation id="3532980081107202182">මිනිත්තු <ph name="MIN_REMAINING" />ක් පමණ ඉතිරිය</translation> <translation id="3557205324756024651">ස්ථානීය අනන්යතාව (විකල්පමය)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">ඔබේ තේරීමට අදාළ තොරතුරු ලබා ගන්න</translation> <translation id="6704062477274546131">DNS විභේදනය</translation> <translation id="6723839937902243910">බලය</translation> +<translation id="6723847290197874913">යතුරු පුවරු පසු ආලෝකය</translation> <translation id="672609503628871915">අළුත් මොනවාදැයි බලන්න</translation> <translation id="6747215703636344499">නැවතිණි - ප්රතිදානය පිරී ඇත</translation> <translation id="6749473226660745022">ඡායාරූප</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index d136bbe8..cc6836c 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">நிலைபொருளைப் புதுப்பிக்கும்போது இந்த வெளிப்புறச் சாதனத்தின் இணைப்பைத் துண்டிக்கவோ உங்கள் கம்ப்யூட்டரை ஷட் டவுன் செய்யவோ கூடாது. இந்தச் சாளரத்தைச் சிறிதாக்கிக்கொள்ளலாம். இந்தப் புதுப்பிப்பு நிறைவடைய சில நிமிடங்கள் ஆகலாம். அதுவரை உங்கள் வெளிப்புறச் சாதனத்தில் வேறு எதுவும் செய்ய முடியாமல் போகலாம்.</translation> <translation id="3486220673238053218">விளக்கம்</translation> <translation id="3488065109653206955">பகுதியளவு செயலாக்கப்பட்டது</translation> +<translation id="3517001332549868749">ChromeOS அப்டேட்</translation> <translation id="3527036260304016759">அறியப்படாத பிழை காரணமாக அச்சிட முடியவில்லை</translation> <translation id="3532980081107202182">சுமார் <ph name="MIN_REMAINING" /> நிமிடங்கள் மீதமுள்ளன</translation> <translation id="3557205324756024651">அக அடையாளம் (விருப்பத்தேர்வு)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">திரையில் நீங்கள் தேர்ந்தெடுத்தது தொடர்பாக தகவல்களைப் பெறவும்</translation> <translation id="6704062477274546131">DNS ரெசல்யூஷன்</translation> <translation id="6723839937902243910">ஆற்றல்</translation> +<translation id="6723847290197874913">கீபோர்டு பேக்லைட்</translation> <translation id="672609503628871915">புதியதைப் பார்க்கவும்</translation> <translation id="6747215703636344499">பிரிண்ட் வெளியே வரும் டிரே நிரம்பிவிட்டதால் அச்சிட முடியவில்லை</translation> <translation id="6749473226660745022">படங்கள்</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index bc83946f..e79e1c7a 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -113,6 +113,7 @@ <translation id="2085089206770112532">ลดความสว่างของหน้าจอ</translation> <translation id="2104796393919810494">ซ่อมเสร็จแล้ว</translation> <translation id="2105810540595158374">อุปกรณ์เป็นอุปกรณ์ควบคุมเกม</translation> +<translation id="2115956742084455574">รหัสไม่ถูกต้อง</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" /> เวอร์ชัน <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736">ใช้ได้ <ph name="AVAILABLE_MEMORY" /> GB จาก <ph name="TOTAL_MEMORY" /> GB</translation> <translation id="2138109643290557664">ล่องลอยผ่านไป</translation> @@ -142,6 +143,7 @@ <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">เปิดบลูทูธเพื่อค้นหาอุปกรณ์ใกล้เคียง</translation> <translation id="2346474577291266260">ดีมาก (<ph name="SIGNAL_STRENGTH" />)</translation> +<translation id="2360257214555822463">ตรวจพบ<ph name="LINK_BEGIN" />คอมโพเนนต์ที่ไม่ตรงตามข้อกำหนด<ph name="LINK_END" /> หากคุณเลือกที่จะยืนยันว่าได้ติดตั้งคอมโพเนนต์เหล่านี้ โปรดดำเนินการดังกล่าวตอนนี้เลย</translation> <translation id="2363636958541445404">เปิดฟีเจอร์นี้เพื่อเลือกตัวเลือกโปรแกรมรักษาหน้าจอ</translation> <translation id="2364498172489649528">ผ่าน</translation> <translation id="2380886658946992094">Legal</translation> @@ -191,6 +193,7 @@ <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation> <translation id="3056720590588772262">ปลายทาง</translation> <translation id="3069085583900247081">การทดสอบไม่สำเร็จ</translation> +<translation id="3076243757415932261">กำลังตรวจสอบความถูกต้องของคอมโพเนนต์...</translation> <translation id="3083667275341675831">การวินิจฉัยการเชื่อมต่อ</translation> <translation id="3084958266922136097">ปิดใช้โปรแกรมรักษาหน้าจอ</translation> <translation id="3091839911843451378">ไม่สำเร็จ - หยุดทำงาน</translation> @@ -219,6 +222,7 @@ <translation id="3368922792935385530">เชื่อมต่อแล้ว</translation> <translation id="3369013195428705271">คุณแน่ใจไหมว่าต้องการล้างประวัติการพิมพ์ทั้งหมด ทั้งนี้ ระบบจะไม่ล้างงานพิมพ์ที่กำลังดำเนินอยู่</translation> <translation id="3404249063913988450">เปิดใช้โปรแกรมรักษาหน้าจอ</translation> +<translation id="3404770484521709967">คอมโพเนนต์ติดตั้งอย่างถูกต้อง</translation> <translation id="3413935475507503304">คลิก "ถัดไป" เพื่อดำเนินการอัปเดตต่อ</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3435738964857648380">ความปลอดภัย</translation> @@ -566,6 +570,7 @@ <translation id="6768237774506518020">อัตราการแปลง DNS ไม่สำเร็จสูง</translation> <translation id="680983167891198932">คีย์</translation> <translation id="6816797338148849397">มีข้อมูลที่เกี่ยวข้องกับสิ่งที่คุณเลือก ใช้แป้นลูกศรขึ้นเพื่อดูข้อมูลนั้น</translation> +<translation id="6840315122969944400">การซ่อม <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">อัตราการคายประจุ</translation> <translation id="6889786074662672253">ขณะรีสตาร์ท โปรดอย่าถอดปลั๊กอุปกรณ์ภายนอกเครื่องนี้หรือปิดคอมพิวเตอร์ คุณย่อหน้าต่างนี้ให้เล็กสุดได้ การดำเนินการอาจใช้เวลาสักครู่และอุปกรณ์ภายนอกอาจใช้ไม่ได้ในช่วงเวลานี้</translation> <translation id="6905724422583748843">กลับไปที่ <ph name="PAGE_NAME" /></translation> @@ -674,6 +679,7 @@ <translation id="8045012663542226664">ปุ่มปิดเสียงไมโครโฟน</translation> <translation id="8075838845814659848">การชาร์จที่เหลือ</translation> <translation id="8082366717211101304">ไม่สามารถแปลง DNS จากแอป Android</translation> +<translation id="8083281199617904460">ขั้นตอนการซ่อมนี้มีไว้สำหรับช่างซ่อมที่ผ่านการฝึกฝน โดยจะเริ่มหลังจากแทนที่คอมโพเนนต์ที่ทำงานผิดพลาดแล้วเท่านั้น</translation> <translation id="808894953321890993">เปลี่ยนรหัสผ่าน</translation> <translation id="8104083085214006426">คุณกำลังใช้เครือข่ายแบบเปิดที่ไม่ปลอดภัย</translation> <translation id="811820734797650957">(Android) ปิงเกตเวย์ได้</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index 4602655..b3e492c 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">Donanım yazılımı güncellenirken bu harici cihazı çıkarmayın ya da bilgisayarınızı kapatmayın. Bu pencereyi simge durumuna küçültebilirsiniz. Güncelleme birkaç dakika sürebilir ve bu süre boyunca harici cihazınız çalışmayabilir.</translation> <translation id="3486220673238053218">tanım</translation> <translation id="3488065109653206955">Kısmen etkinleştirildi</translation> +<translation id="3517001332549868749">ChromeOS güncellemesi</translation> <translation id="3527036260304016759">İşlem başarısız - Bilinmeyen hata</translation> <translation id="3532980081107202182">Yaklaşık <ph name="MIN_REMAINING" /> dakika kaldı</translation> <translation id="3557205324756024651">Yerel kimlik (isteğe bağlı)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Seçiminizle alakalı bilgi edinin</translation> <translation id="6704062477274546131">DNS Çözümlemesi</translation> <translation id="6723839937902243910">Güç</translation> +<translation id="6723847290197874913">Klavye arka ışığı</translation> <translation id="672609503628871915">Yenilikleri görüntüle</translation> <translation id="6747215703636344499">Durduruldu - Çıkış tepsisi dolu</translation> <translation id="6749473226660745022">Fotoğraflar</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index f1dd81d..1aa537a 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -109,7 +109,7 @@ <translation id="2008685064673031089">Пошук Prime</translation> <translation id="2016697457005847575">Виконайте дії для вирішення проблеми</translation> <translation id="202500043506723828">EID</translation> -<translation id="2080070583977670716">Більше налаштувань</translation> +<translation id="2080070583977670716">Інші налаштування</translation> <translation id="2085089206770112532">Зменшити яскравість екрана</translation> <translation id="2104796393919810494">Ремонт завершено</translation> <translation id="2105810540595158374">Це ігровий контролер.</translation> @@ -229,6 +229,7 @@ <translation id="3484914941826596830">Поки мікропрограма оновлюється, не відключайте цей зовнішній пристрій і не завершуйте роботу комп’ютера. Можете згорнути це вікно. Оновлення може зайняти кілька хвилин, і впродовж цього часу зовнішній пристрій, імовірно, не працюватиме.</translation> <translation id="3486220673238053218">визначення</translation> <translation id="3488065109653206955">Частково активовано</translation> +<translation id="3517001332549868749">Оновлення ОС Chrome</translation> <translation id="3527036260304016759">Не надруковано – невідома помилка</translation> <translation id="3532980081107202182">Залишилося приблизно <ph name="MIN_REMAINING" /> хв</translation> <translation id="3557205324756024651">Локальна ідентифікація (необов’язково)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">Отримати інформацію, пов'язану з виділеним текстом</translation> <translation id="6704062477274546131">Розпізнавання DNS</translation> <translation id="6723839937902243910">Заряд</translation> +<translation id="6723847290197874913">Підсвічування клавіатури</translation> <translation id="672609503628871915">Докладніше про нові функції</translation> <translation id="6747215703636344499">Зупинено – вихідний лоток заповнений</translation> <translation id="6749473226660745022">Фото</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index f6352b8..6a90269 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">固件更新期间,请不要拔掉此外部设备的电源插头或关闭您的计算机。您可以最小化此窗口。此更新可能需要几分钟时间,在此期间,您的外部设备可能无法正常使用。</translation> <translation id="3486220673238053218">定义</translation> <translation id="3488065109653206955">部分激活</translation> +<translation id="3517001332549868749">Chrome 操作系统更新</translation> <translation id="3527036260304016759">失败 - 不明错误</translation> <translation id="3532980081107202182">还剩大约 <ph name="MIN_REMAINING" /> 分钟</translation> <translation id="3557205324756024651">本地身份(可选)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">获取与您的所选项相关的信息</translation> <translation id="6704062477274546131">DNS 解析</translation> <translation id="6723839937902243910">电源</translation> +<translation id="6723847290197874913">键盘背光</translation> <translation id="672609503628871915">了解一下新变化</translation> <translation id="6747215703636344499">已停止 - 出纸盘已满</translation> <translation id="6749473226660745022">照片</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb index 55d860d..4092432 100644 --- a/chromeos/strings/chromeos_strings_zh-HK.xtb +++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">韌體更新時,請勿拔除此外部裝置的插頭或關閉電腦。您可將此視窗縮到最小。此更新可能需要幾分鐘,這段期間外部裝置可能無法正常運作。</translation> <translation id="3486220673238053218">定義</translation> <translation id="3488065109653206955">部分已啟用</translation> +<translation id="3517001332549868749">Chrome OS 更新</translation> <translation id="3527036260304016759">失敗 - 不明錯誤</translation> <translation id="3532980081107202182">大約尚餘 <ph name="MIN_REMAINING" /> 分鐘</translation> <translation id="3557205324756024651">本機身分 (選用)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">取得您選取項目相關資料</translation> <translation id="6704062477274546131">DNS 解析</translation> <translation id="6723839937902243910">電源</translation> +<translation id="6723847290197874913">鍵盤背光</translation> <translation id="672609503628871915">查看最新內容</translation> <translation id="6747215703636344499">已停止 - 輸出紙匣已滿</translation> <translation id="6749473226660745022">相片</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index 3bf52e3..1623902 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -229,6 +229,7 @@ <translation id="3484914941826596830">在韌體更新期間,請勿拔除這台外部裝置的插頭或關閉電腦。你可以將這個視窗縮到最小。更新作業可能需要幾分鐘才會完成,這段期間外部裝置可能無法正常運作。</translation> <translation id="3486220673238053218">定義</translation> <translation id="3488065109653206955">部分已啟用</translation> +<translation id="3517001332549868749">Chrome OS 更新</translation> <translation id="3527036260304016759">失敗 - 不明的錯誤</translation> <translation id="3532980081107202182">大約還剩 <ph name="MIN_REMAINING" /> 分鐘</translation> <translation id="3557205324756024651">本機識別 (選用)</translation> @@ -554,6 +555,7 @@ <translation id="6692996468359469499">取得選取項目的相關資訊</translation> <translation id="6704062477274546131">DNS 解析</translation> <translation id="6723839937902243910">電源</translation> +<translation id="6723847290197874913">鍵盤背光</translation> <translation id="672609503628871915">查看新功能</translation> <translation id="6747215703636344499">已停止 - 輸出紙匣已滿</translation> <translation id="6749473226660745022">相片</translation>
diff --git a/components/autofill_assistant/browser/js_flow_util.cc b/components/autofill_assistant/browser/js_flow_util.cc index ee0a5ec..bb83905 100644 --- a/components/autofill_assistant/browser/js_flow_util.cc +++ b/components/autofill_assistant/browser/js_flow_util.cc
@@ -4,6 +4,7 @@ #include "components/autofill_assistant/browser/js_flow_util.h" #include "base/base64.h" +#include "base/logging.h" #include "base/strings/strcat.h" #include "components/autofill_assistant/browser/model.pb.h" #include "components/autofill_assistant/browser/service.pb.h" @@ -38,8 +39,11 @@ case runtime::RemoteObjectType::NUMBER: case runtime::RemoteObjectType::BOOLEAN: return true; - default: + default: { + DVLOG(1) << "Flow return value type is not allowed: " + << static_cast<int>(type); return false; + } } } @@ -101,6 +105,7 @@ devtools_reply_status, devtools_result, __FILE__, __LINE__, js_line_offset, num_stack_entries_to_drop); if (!status.ok()) { + DVLOG(1) << "The JS flow result did not contain a valid value."; return status; } @@ -113,6 +118,7 @@ if (!remote_object->HasValue() || !IsAllowedRemoteType(remote_object->GetType())) { + DVLOG(1) << "The JS flow result did not have a value or had a bad type."; status.set_proto_status(INVALID_ACTION); status.mutable_details() ->mutable_unexpected_error_info() @@ -126,6 +132,8 @@ std::string error_message; if (!ContainsOnlyAllowedValues(*remote_object->GetValue(), error_message)) { + DVLOG(1) << "The JS flow result did contain disallowed values. " + << error_message; status.set_proto_status(INVALID_ACTION); status.mutable_details() ->mutable_unexpected_error_info() @@ -146,6 +154,7 @@ } if (!value.is_dict()) { + DVLOG(1) << "The JS flow result was not an object."; return ClientStatusWithSourceLocation(INVALID_ACTION, __FILE__, __LINE__); }
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc index 37480b2f..a2d864f 100644 --- a/components/autofill_assistant/browser/script_executor.cc +++ b/components/autofill_assistant/browser/script_executor.cc
@@ -985,9 +985,9 @@ previous_action_type_ = processed_action_proto->action().action_info_case(); processed_actions_.emplace_back(*processed_action_proto); -#ifdef NDEBUG - VLOG(2) << "Action completed"; -#else + VLOG(2) << "Action completed with status " + << processed_action_proto->status(); +#ifndef NDEBUG VLOG(2) << "Requested delay ms: " << processed_action_proto->timing_stats().delay_ms(); VLOG(2) << "Active time ms: "
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp index a5551ea2..98d5ace5 100644 --- a/components/autofill_strings.grdp +++ b/components/autofill_strings.grdp
@@ -140,17 +140,33 @@ Manage... </message> - <message name="IDS_AUTOFILL_MANAGE_ADDRESSES" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses in the user profile that can be used by Chrome Autofill."> - Manage addresses... - </message> + <if expr="not use_titlecase"> + <message name="IDS_AUTOFILL_MANAGE_ADDRESSES" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses in the user profile that can be used by Chrome Autofill."> + Manage addresses... + </message> - <message name="IDS_AUTOFILL_MANAGE_PAYMENT_METHODS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for payment methods like credit cards/debit cards. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage the payment methods in the user profile that can be used by Chrome Autofill."> - Manage payment methods... - </message> + <message name="IDS_AUTOFILL_MANAGE_PAYMENT_METHODS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for payment methods like credit cards/debit cards. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage the payment methods in the user profile that can be used by Chrome Autofill."> + Manage payment methods... + </message> - <message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Chrome Autofill."> - Manage passwords... - </message> + <message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Chrome Autofill."> + Manage passwords... + </message> + </if> + + <if expr="use_titlecase"> + <message name="IDS_AUTOFILL_MANAGE_ADDRESSES" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses in the user profile that can be used by Chrome Autofill."> + Manage Addresses... + </message> + + <message name="IDS_AUTOFILL_MANAGE_PAYMENT_METHODS" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for payment methods like credit cards/debit cards. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage the payment methods in the user profile that can be used by Chrome Autofill."> + Manage Payment Methods... + </message> + + <message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Chrome Autofill."> + Manage Passwords... + </message> + </if> <message name="IDS_AUTOFILL_SCAN_CREDIT_CARD" desc="An item in the autofill popup that triggers a new credit card to be scanned using the camera on the device." formatter_data="android_java"> Scan new card
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_ADDRESSES.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_ADDRESSES.png.sha1 new file mode 100644 index 0000000..103ebee --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_ADDRESSES.png.sha1
@@ -0,0 +1 @@ +34422c7d0da142162559ebe94ef835385d5cc5e6 \ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_PASSWORDS.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_PASSWORDS.png.sha1 new file mode 100644 index 0000000..c96b128 --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_PASSWORDS.png.sha1
@@ -0,0 +1 @@ +7cf174c28e0e7c92b916543fb27cb48e36c14b82 \ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_PAYMENT_METHODS.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_PAYMENT_METHODS.png.sha1 new file mode 100644 index 0000000..0e3ce8a --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_PAYMENT_METHODS.png.sha1
@@ -0,0 +1 @@ +9fe038242e20ee472a1ce86773da95acbb51fdca \ No newline at end of file
diff --git a/components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_view.xml b/components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_view.xml index 1cdc406..a393c52 100644 --- a/components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_view.xml +++ b/components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_view.xml
@@ -83,6 +83,12 @@ </org.chromium.components.browser_ui.widget.DualControlLayout> + <FrameLayout + android:id="@+id/custom_button_bar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" /> + <LinearLayout android:id="@+id/footer" android:layout_width="match_parent"
diff --git a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java index a351367..8bcf933 100644 --- a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java
@@ -60,6 +60,7 @@ private TextView mMessageParagraph1; private TextView mMessageParagraph2; private ViewGroup mCustomViewContainer; + private ViewGroup mCustomButtonBarViewContainer; private View mButtonBar; private Button mPositiveButton; private Button mNegativeButton; @@ -89,6 +90,7 @@ mMessageParagraph1 = findViewById(R.id.message_paragraph_1); mMessageParagraph2 = findViewById(R.id.message_paragraph_2); mCustomViewContainer = findViewById(R.id.custom); + mCustomButtonBarViewContainer = findViewById(R.id.custom_button_bar); mButtonBar = findViewById(R.id.button_bar); mPositiveButton = findViewById(R.id.positive_button); mNegativeButton = findViewById(R.id.negative_button); @@ -294,6 +296,25 @@ } } + /** @param view The customized button bar for the dialog. */ + void setCustomButtonBar(View view) { + if (mCustomButtonBarViewContainer.getChildCount() > 0) { + mCustomButtonBarViewContainer.removeAllViews(); + } + + if (view != null) { + UiUtils.removeViewFromParent(view); + mCustomButtonBarViewContainer.addView(view); + mCustomButtonBarViewContainer.setVisibility(View.VISIBLE); + assert mCustomButtonBarViewContainer.getChildCount() > 0 + : "The CustomButtonBar cannot be empty."; + + } else { + mCustomButtonBarViewContainer.setVisibility(View.GONE); + } + updateButtonVisibility(); + } + /** * @param buttonType Indicates which button should be returned. */ @@ -380,10 +401,13 @@ private void updateButtonVisibility() { boolean positiveButtonVisible = !TextUtils.isEmpty(mPositiveButton.getText()); boolean negativeButtonVisible = !TextUtils.isEmpty(mNegativeButton.getText()); - boolean buttonBarVisible = positiveButtonVisible || negativeButtonVisible; + boolean customButtonBarViewVisible = + mCustomButtonBarViewContainer.getVisibility() == View.VISIBLE; + boolean defaultButtonBarVisible = + (positiveButtonVisible || negativeButtonVisible) && !customButtonBarViewVisible; mPositiveButton.setVisibility(positiveButtonVisible ? View.VISIBLE : View.GONE); mNegativeButton.setVisibility(negativeButtonVisible ? View.VISIBLE : View.GONE); - mButtonBar.setVisibility(buttonBarVisible ? View.VISIBLE : View.GONE); + mButtonBar.setVisibility(defaultButtonBarVisible ? View.VISIBLE : View.GONE); } }
diff --git a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.java index 7719416..72dd1e02c 100644 --- a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.java
@@ -5,6 +5,7 @@ package org.chromium.components.browser_ui.modaldialog; import android.text.TextUtils; +import android.view.View; import org.chromium.ui.modaldialog.ModalDialogProperties; import org.chromium.ui.modelutil.PropertyKey; @@ -32,6 +33,8 @@ view.setMessageParagraph2(model.get(ModalDialogProperties.MESSAGE_PARAGRAPH_2)); } else if (ModalDialogProperties.CUSTOM_VIEW == propertyKey) { view.setCustomView(model.get(ModalDialogProperties.CUSTOM_VIEW)); + } else if (ModalDialogProperties.CUSTOM_BUTTON_BAR_VIEW == propertyKey) { + view.setCustomButtonBar(model.get(ModalDialogProperties.CUSTOM_BUTTON_BAR_VIEW)); } else if (ModalDialogProperties.POSITIVE_BUTTON_TEXT == propertyKey) { assert checkFilterTouchConsistency(model); view.setButtonText(ModalDialogProperties.ButtonType.POSITIVE, @@ -76,6 +79,7 @@ // Intentionally left empty since this is a property used for the dialog container. } else if (ModalDialogProperties.BUTTON_STYLES == propertyKey) { assert checkFilledButtonConsistency(model); + assert checkCustomButtonsConsistency(model); // Intentionally left empty since this is only read once before the dialog is inflated. } else if (ModalDialogProperties.FULLSCREEN_DIALOG == propertyKey || ModalDialogProperties.DIALOG_WHEN_LARGE == propertyKey) { @@ -120,4 +124,14 @@ return true; } + + /** + * Checks that BUTTON_STYLES isn't present together with CUSTOM_BUTTON_BAR_VIEW because the + * custom button bar overrides the default positive and negative buttons.. + */ + private static boolean checkCustomButtonsConsistency(PropertyModel model) { + int styles = model.get(ModalDialogProperties.BUTTON_STYLES); + View customButtons = model.get(ModalDialogProperties.CUSTOM_BUTTON_BAR_VIEW); + return styles == 0 || customButtons == null; + } }
diff --git a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.java index ccc8d4c..d444597 100644 --- a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.java
@@ -27,7 +27,10 @@ import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; import android.widget.FrameLayout; +import android.widget.RelativeLayout; import android.widget.TextView; import androidx.test.filters.MediumTest; @@ -71,6 +74,8 @@ private TextView mCustomTextView1; private TextView mCustomTextView2; private PropertyModel.Builder mModelBuilder; + private RelativeLayout mCustomButtonBar1; + private RelativeLayout mCustomButtonBar2; @BeforeClass public static void setupSuite() { @@ -99,6 +104,20 @@ mCustomTextView1.setId(R.id.test_view_one); mCustomTextView2 = new TextView(sActivity); mCustomTextView2.setId(R.id.test_view_two); + + mCustomButtonBar1 = new RelativeLayout(sActivity); + mCustomButtonBar1.setId(R.id.test_button_bar_one); + mCustomButtonBar2 = new RelativeLayout(sActivity); + mCustomButtonBar2.setId(R.id.test_button_bar_two); + Button button1 = new Button(sActivity); + button1.setText(R.string.ok); + Button button2 = new Button(sActivity); + button2.setText(R.string.cancel); + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); + mCustomButtonBar1.addView(button1, params); + mCustomButtonBar2.addView(button2, params); }); } @@ -117,6 +136,8 @@ onView(withId(R.id.button_bar)).check(matches(not(isDisplayed()))); onView(withId(R.id.positive_button)).check(matches(allOf(not(isDisplayed()), isEnabled()))); onView(withId(R.id.negative_button)).check(matches(allOf(not(isDisplayed()), isEnabled()))); + onView(withId(R.id.custom_button_bar)) + .check(matches(allOf(not(isDisplayed()), isEnabled()))); } @Test @@ -284,6 +305,41 @@ @Test @MediumTest @Feature({"ModalDialog"}) + public void testCustomButtonBarView() { + // Verify custom button bar view set from builder is displayed. + PropertyModel model = createModel( + mModelBuilder.with(ModalDialogProperties.CUSTOM_BUTTON_BAR_VIEW, mCustomButtonBar1) + .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, sResources, R.string.ok) + .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT, sResources, + R.string.cancel)); + onView(withId(R.id.custom_button_bar)) + .check(matches(allOf(isDisplayed(), withChild(withId(R.id.test_button_bar_one))))); + + // There are no positive and negative buttons when the custom button bar is present. + onView(withId(R.id.button_bar)).check(matches(not(isDisplayed()))); + onView(withId(R.id.positive_button)).check(matches(not(isDisplayed()))); + onView(withId(R.id.negative_button)).check(matches(not(isDisplayed()))); + + // Change custom button bar view. + TestThreadUtils.runOnUiThreadBlocking( + () -> model.set(ModalDialogProperties.CUSTOM_BUTTON_BAR_VIEW, mCustomButtonBar2)); + onView(withId(R.id.custom_button_bar)) + .check(matches(allOf(isDisplayed(), withChild(withId(R.id.test_button_bar_two))))); + + // Set custom button bar view to null. + TestThreadUtils.runOnUiThreadBlocking( + () -> model.set(ModalDialogProperties.CUSTOM_BUTTON_BAR_VIEW, null)); + onView(withId(R.id.custom_button_bar)).check(matches(not(isDisplayed()))); + + // The positive and negative buttons are back since the custom button bar is not there. + onView(withId(R.id.button_bar)).check(matches(isDisplayed())); + onView(withId(R.id.positive_button)).check(matches(isDisplayed())); + onView(withId(R.id.negative_button)).check(matches(isDisplayed())); + } + + @Test + @MediumTest + @Feature({"ModalDialog"}) public void testButtonBar() { // Set text for both positive button and negative button. PropertyModel model = createModel(
diff --git a/components/browser_ui/modaldialog/android/test/java/res/values/ids.xml b/components/browser_ui/modaldialog/android/test/java/res/values/ids.xml index 8315189..201dbdc 100644 --- a/components/browser_ui/modaldialog/android/test/java/res/values/ids.xml +++ b/components/browser_ui/modaldialog/android/test/java/res/values/ids.xml
@@ -6,4 +6,6 @@ <!-- Test view ids --> <item type="id" name="test_view_one" /> <item type="id" name="test_view_two" /> + <item type="id" name="test_button_bar_one" /> + <item type="id" name="test_button_bar_two" /> </resources>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index ce05858..57d275f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">መረጃ ደብቅ</translation> <translation id="3328801116991980348">የጣቢያ መረጃ</translation> <translation id="3333961966071413176">ሁሉም እውቂያዎች</translation> +<translation id="3362437373201486687">የብሉቱዝ መሣሪያዎችን በመቃኘት ላይ</translation> <translation id="3386292677130313581">ጣቢያዎች አካባቢዎን እንዲያውቁ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation> <translation id="3538390592868664640">ጣቢያዎች የዙሪያዎ የ3ል ካርታ እንዳይፈጥሩ ወይም የካሜራ ቦታን እንዳይከታተሉ ያግዷቸው</translation> <translation id="3551268116566418498">ከማንነት የማያሳውቅ ሁነታ ይውጣ?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">ሁልጊዜ</translation> <translation id="757524316907819857">ጣቢያዎች ጥበቃ የሚደረግለትን ይዘት እንዳያጫውቱ ያግዱ</translation> <translation id="7577900504646297215">ፍላጎቶችን አቀናብር</translation> +<translation id="7594634374516752650">ከብሉቱዝ መሣሪያ ጋር ተገናኝቷል</translation> <translation id="7649070708921625228">እገዛ</translation> <translation id="7658239707568436148">ይቅር</translation> <translation id="7781829728241885113">ትናንት</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb index 6795a52..e96f9ee 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -101,7 +101,7 @@ <translation id="3295602654194328831">Sakrij informacije</translation> <translation id="3328801116991980348">Informacije o web lokaciji</translation> <translation id="3333961966071413176">Svi kontakti</translation> -<translation id="3362437373201486687">Traženje Bluetooth uređaja</translation> +<translation id="3362437373201486687">Skeniranje Bluetooth uređaja</translation> <translation id="3386292677130313581">Web lokacije moraju tražiti dozvolu za pristup lokaciji (preporučeno)</translation> <translation id="3538390592868664640">Web lokacijama je blokirano kreiranje 3D mape vašeg okruženja ili praćenje položaja kamere</translation> <translation id="3551268116566418498">Napustiti anonimni načina rada?</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb index e22718b..3f38304 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Skrýt informace</translation> <translation id="3328801116991980348">Informace o stránkách</translation> <translation id="3333961966071413176">Všechny kontakty</translation> +<translation id="3362437373201486687">Vyhledávání zařízení Bluetooth</translation> <translation id="3386292677130313581">Pokud web bude chtít znát vaši polohu, zobrazit dotaz (doporučeno)</translation> <translation id="3538390592868664640">Bránit webům ve vytváření 3D mapy okolí a ve sledování polohy kamery</translation> <translation id="3551268116566418498">Ukončit anonymní režim?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Vždy</translation> <translation id="757524316907819857">Bránit webům v přehrávání chráněného obsahu</translation> <translation id="7577900504646297215">Spravovat zájmy</translation> +<translation id="7594634374516752650">Telefon je připojen k zařízení Bluetooth</translation> <translation id="7649070708921625228">Nápověda</translation> <translation id="7658239707568436148">Zrušit</translation> <translation id="7781829728241885113">Včera</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb index 2399ccc..b301ca6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Skjul oplysninger</translation> <translation id="3328801116991980348">Webstedoplysninger</translation> <translation id="3333961966071413176">Alle kontakter</translation> +<translation id="3362437373201486687">Søger efter Bluetooth-enheder</translation> <translation id="3386292677130313581">Spørg, om websites må få adgang til din lokation (anbefales)</translation> <translation id="3538390592868664640">Bloker oprettelsen af 3D-kort over dine omgivelser eller registrering af kamerapositionen for websites</translation> <translation id="3551268116566418498">Forlad inkognitotilstand?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Altid</translation> <translation id="757524316907819857">Bloker afspilning af beskyttet indhold på websites</translation> <translation id="7577900504646297215">Administrer interesser</translation> +<translation id="7594634374516752650">Forbundet til en Bluetooth-enhed</translation> <translation id="7649070708921625228">Hjælp</translation> <translation id="7658239707568436148">Annuller</translation> <translation id="7781829728241885113">I går</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb index 5be6b48..aebb21c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Απόκρυψη πληροφοριών</translation> <translation id="3328801116991980348">Πληροφορίες ιστοτόπου</translation> <translation id="3333961966071413176">Όλες οι επαφές</translation> +<translation id="3362437373201486687">Σάρωση για συσκευές Bluetooth</translation> <translation id="3386292677130313581">Να γίνεται ερώτηση προτού επιτραπεί η κοινοποίηση της τοποθεσίας σας σε ιστότοπους (συνιστάται)</translation> <translation id="3538390592868664640">Αποκλείστε ιστοτόπους από τη δημιουργία ενός τρισδιάστατου χάρτη του περιβάλλοντα χώρου σας ή την παρακολούθηση της θέσης της κάμερας.</translation> <translation id="3551268116566418498">Έξοδος από ανώνυμη περιήγηση;</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Πάντα</translation> <translation id="757524316907819857">Αποκλεισμός αναπαραγωγής προστατευόμενου περιεχομένου από ιστοτόπους</translation> <translation id="7577900504646297215">Διαχείριση ενδιαφερόντων</translation> +<translation id="7594634374516752650">Συνδέθηκε σε μια συσκευή Bluetooth</translation> <translation id="7649070708921625228">Βοήθεια</translation> <translation id="7658239707568436148">Ακύρωση</translation> <translation id="7781829728241885113">Χθες</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index 1f86d729e4..33705ec7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Peida teave</translation> <translation id="3328801116991980348">Saiditeave</translation> <translation id="3333961966071413176">Kõik kontaktid</translation> +<translation id="3362437373201486687">Bluetooth-seadmete otsimine</translation> <translation id="3386292677130313581">Küsi enne saitidele minu asukoha avaldamist (soovitatav)</translation> <translation id="3538390592868664640">Saitide jaoks blokeeritakse teid ümbritsevast 3D-kaardi loomine või kaamera asendi jälgimine</translation> <translation id="3551268116566418498">Kas lahkuda inkognito režiimist?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Alati</translation> <translation id="757524316907819857">Saitidel kaitstud sisu esitamise blokeerimine</translation> <translation id="7577900504646297215">Huvide haldamine</translation> +<translation id="7594634374516752650">Ühendatud Bluetooth-seadmega</translation> <translation id="7649070708921625228">Abi</translation> <translation id="7658239707568436148">Tühista</translation> <translation id="7781829728241885113">Eile</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb index 2322ea1a..2a9c4fd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">پنهان کردن اطلاعات</translation> <translation id="3328801116991980348">اطلاعات سایت</translation> <translation id="3333961966071413176">همه مخاطبین</translation> +<translation id="3362437373201486687">درحال جستجوی دستگاههای بلوتوث</translation> <translation id="3386292677130313581">قبل از اجازه به سایتها برای اطلاع از مکانتان، ابتدا سؤال شود (توصیه میشود)</translation> <translation id="3538390592868664640">قابلیت سایتها برای ایجاد نقشه سهبعدی از محیط یا ردیابی موقعیت دوربین مسدود میشود</translation> <translation id="3551268116566418498">از «حالت ناشناس» خارج میشوید؟</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">همیشه</translation> <translation id="757524316907819857">مسدود کردن سایتها برای پخش محتوای محافظتشده</translation> <translation id="7577900504646297215">مدیریت علایق</translation> +<translation id="7594634374516752650">به دستگاه بلوتوث متصل است</translation> <translation id="7649070708921625228">راهنما</translation> <translation id="7658239707568436148">لغو</translation> <translation id="7781829728241885113">دیروز</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb index bc2bdff..3043167 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Piilota tiedot</translation> <translation id="3328801116991980348">Tietoja sivustosta</translation> <translation id="3333961966071413176">Kaikki kontaktit</translation> +<translation id="3362437373201486687">Haetaan Bluetooth-laitteita</translation> <translation id="3386292677130313581">Pyydä lupaa, kun sivustot yrittävät käyttää sijaintiasi (suositus).</translation> <translation id="3538390592868664640">Estä sivustoja luomasta 3D-karttaa ympäristöstäsi tai seuraamasta kameran asentoa</translation> <translation id="3551268116566418498">Poistutaanko incognito-tilasta?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Aina</translation> <translation id="757524316907819857">Estä sivustoja toistamasta suojattua sisältöä</translation> <translation id="7577900504646297215">Ylläpidä kiinnostuksen kohteita</translation> +<translation id="7594634374516752650">Yhdistetty Bluetooth-laitteeseen</translation> <translation id="7649070708921625228">Ohje</translation> <translation id="7658239707568436148">Peru</translation> <translation id="7781829728241885113">Eilen</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb index 6761ef62..3aeff82 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Masquer les informations</translation> <translation id="3328801116991980348">Informations sur le site</translation> <translation id="3333961966071413176">Tous les contacts</translation> +<translation id="3362437373201486687">Recherche d'appareils Bluetooth…</translation> <translation id="3386292677130313581">Demander avant d'autoriser des sites à accéder à ma position (recommandé)</translation> <translation id="3538390592868664640">Empêcher les sites de créer un plan 3D de votre environnement ou de suivre la position de la caméra</translation> <translation id="3551268116566418498">Quitter la navigation privée ?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Toujours</translation> <translation id="757524316907819857">Empêcher les sites de lire les contenus protégés</translation> <translation id="7577900504646297215">Gérer les centres d'intérêt</translation> +<translation id="7594634374516752650">Connecté à un appareil Bluetooth</translation> <translation id="7649070708921625228">Aide</translation> <translation id="7658239707568436148">Annuler</translation> <translation id="7781829728241885113">Hier</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb index 33e0fdb..b9f0b27 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Sembunyikan Info</translation> <translation id="3328801116991980348">Informasi situs</translation> <translation id="3333961966071413176">Semua kontak</translation> +<translation id="3362437373201486687">Memindai perangkat Bluetooth</translation> <translation id="3386292677130313581">Minta izin sebelum memungkinkan situs mengetahui lokasi Anda (disarankan)</translation> <translation id="3538390592868664640">Blokir situs agar tidak membuat peta 3D untuk area di sekeliling Anda atau melacak posisi kamera</translation> <translation id="3551268116566418498">Keluar dari mode Samaran?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Selalu</translation> <translation id="757524316907819857">Blokir situs agar tidak memutar konten yang dilindungi</translation> <translation id="7577900504646297215">Kelola minat</translation> +<translation id="7594634374516752650">Terhubung ke perangkat Bluetooth</translation> <translation id="7649070708921625228">Bantuan</translation> <translation id="7658239707568436148">Batal</translation> <translation id="7781829728241885113">Kemarin</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb index 01fd59ae..0a68ce9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Ақпаратты жасыру</translation> <translation id="3328801116991980348">Сайт ақпараты</translation> <translation id="3333961966071413176">Барлық контакт</translation> +<translation id="3362437373201486687">Bluetooth құрылғылары сканерленуде</translation> <translation id="3386292677130313581">Сайттар орналасқан орныңызды анықтау үшін рұқсат сұрайды (ұсынылады)</translation> <translation id="3538390592868664640">Сайттарға айналаңыздың 3D картасын жасауға немесе камера орнын бақылауға тыйым салу</translation> <translation id="3551268116566418498">Инкогнито режимінен шығасыз ба?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Әрқашан</translation> <translation id="757524316907819857">Сайттардың қорғалған мазмұнды ойнатуына тыйым салу</translation> <translation id="7577900504646297215">Қызығушылықтарды басқару</translation> +<translation id="7594634374516752650">Bluetooth құрылғысына жалғанды</translation> <translation id="7649070708921625228">Анықтама</translation> <translation id="7658239707568436148">Бас тарту</translation> <translation id="7781829728241885113">Кеше</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb index b9f33e9..6e5bb6dd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Slėpti informaciją</translation> <translation id="3328801116991980348">Svetainės informacija</translation> <translation id="3333961966071413176">Visi kontaktai</translation> +<translation id="3362437373201486687">Nuskaitoma ieškant „Bluetooth“ įrenginių</translation> <translation id="3386292677130313581">Klausti prieš leidžiant svetainėms žinoti vietą (rekomenduojama)</translation> <translation id="3538390592868664640">Blokuoti, kad svetainės nekurtų jūsų aplinkos 3D žemėlapio ir nestebėtų kameros padėties</translation> <translation id="3551268116566418498">Išjungti inkognito režimą?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Visada</translation> <translation id="757524316907819857">Užblokuoti svetaines, kad neleistų apsaugoto turinio</translation> <translation id="7577900504646297215">Tvarkyti pomėgius</translation> +<translation id="7594634374516752650">Prijungta prie „Bluetooth“ įrenginio</translation> <translation id="7649070708921625228">Pagalba</translation> <translation id="7658239707568436148">Atšaukti</translation> <translation id="7781829728241885113">Vakar</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb index bf0f280..5730237b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Мэдээллийг нуух</translation> <translation id="3328801116991980348">Сайтын мэдээлэл</translation> <translation id="3333961966071413176">Бүх харилцагч</translation> +<translation id="3362437373201486687">Bluetooth төхөөрөмжүүдийг скан хийж байна</translation> <translation id="3386292677130313581">Сайтууд байршил мэдэх зөвшөөрөл авах (санал болгосон)</translation> <translation id="3538390592868664640">Сайтуудад таны эргэн тойрны 3D газрын зургийг үүсгэх эсвэл камерын хөдөлгөөнийг хянахыг хориглох</translation> <translation id="3551268116566418498">Нууцлалтай горимоос гарах уу?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Үргэлж</translation> <translation id="757524316907819857">Хамгаалалттай контентыг тоглуулж буй сайтуудыг блок хийх</translation> <translation id="7577900504646297215">Сонирхлыг удирдах</translation> +<translation id="7594634374516752650">Bluetooth төхөөрөмжид холбогдлоо</translation> <translation id="7649070708921625228">Тусламж</translation> <translation id="7658239707568436148">Болих</translation> <translation id="7781829728241885113">Өчигдөр</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb index 219739a..731b0495 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Informatie verbergen</translation> <translation id="3328801116991980348">Site-informatie</translation> <translation id="3333961966071413176">Alle contacten</translation> +<translation id="3362437373201486687">Scannen naar bluetooth-apparaten</translation> <translation id="3386292677130313581">Vragen of je sites toegang wilt verlenen tot je locatie (aanbevolen)</translation> <translation id="3538390592868664640">Voorkomen dat sites een 3D-kaart van je omgeving maken of de camerapositie volgen</translation> <translation id="3551268116566418498">Incognitomodus verlaten?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Altijd</translation> <translation id="757524316907819857">Blokkeren dat sites beschermde content kunnen afspelen</translation> <translation id="7577900504646297215">Interesses beheren</translation> +<translation id="7594634374516752650">Verbonden met een bluetooth-apparaat</translation> <translation id="7649070708921625228">Hulp</translation> <translation id="7658239707568436148">Annuleren</translation> <translation id="7781829728241885113">Gisteren</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb index b057773..da0186b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">ਜਾਣਕਾਰੀ ਲੁਕਾਓ</translation> <translation id="3328801116991980348">ਸਾਈਟ ਜਾਣਕਾਰੀ</translation> <translation id="3333961966071413176">ਸਭ ਸੰਪਰਕ</translation> +<translation id="3362437373201486687">ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਲਈ ਸਕੈਨ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> <translation id="3386292677130313581">ਸਾਈਟਾਂ ਨੂੰ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਜਾਣਨ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੀ ਇਜਾਜ਼ਤ ਲੈਣ ਨੂੰ ਜ਼ਰੂਰੀ ਬਣਾਓ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> <translation id="3538390592868664640">ਸਾਈਟਾਂ ਨੂੰ ਤੁਹਾਡੇ ਆਲੇ-ਦੁਆਲੇ ਦਾ 3D ਨਕਸ਼ਾ ਬਣਾਉਣ ਜਾਂ ਕੈਮਰਾ ਸਥਿਤੀ ਨੂੰ ਟਰੈਕ ਕਰਨ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation> <translation id="3551268116566418498">ਕੀ ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਨੂੰ ਛੱਡਣਾ ਹੈ?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">ਹਮੇਸ਼ਾਂ</translation> <translation id="757524316907819857">ਸਾਈਟਾਂ ਨੂੰ ਸੁਰੱਖਿਅਤ ਸਮੱਗਰੀ ਚਲਾਉਣ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation> <translation id="7577900504646297215">ਦਿਲਚਸਪੀਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> +<translation id="7594634374516752650">ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤੀ ਗਈ</translation> <translation id="7649070708921625228">ਸਹਾਇਤਾ</translation> <translation id="7658239707568436148">ਰੱਦ ਕਰੋ</translation> <translation id="7781829728241885113">ਕੱਲ੍ਹ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb index 5c44ac6..6b826b4f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Ukryj informacje</translation> <translation id="3328801116991980348">Informacje o witrynie</translation> <translation id="3333961966071413176">Wszystkie kontakty</translation> +<translation id="3362437373201486687">Skanuję w poszukiwaniu urządzeń Bluetooth</translation> <translation id="3386292677130313581">Pytaj, zanim udostępnisz stronom swoją lokalizację (zalecane)</translation> <translation id="3538390592868664640">Nie zezwalaj stronom na tworzenie mapy 3D Twojego otoczenia ani na śledzenie pozycji kamery</translation> <translation id="3551268116566418498">Wyłączyć tryb incognito?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Zawsze</translation> <translation id="757524316907819857">Blokuj odtwarzanie treści chronionej na stronach</translation> <translation id="7577900504646297215">Zarządzaj zainteresowaniami</translation> +<translation id="7594634374516752650">Połączono z urządzeniem Bluetooth</translation> <translation id="7649070708921625228">Pomoc</translation> <translation id="7658239707568436148">Anuluj</translation> <translation id="7781829728241885113">Wczoraj</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb index e4ca118..2770218b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Скрыть информацию</translation> <translation id="3328801116991980348">Информация о сайте</translation> <translation id="3333961966071413176">Все контакты</translation> +<translation id="3362437373201486687">Поиск устройств Bluetooth</translation> <translation id="3386292677130313581">Запрашивать разрешение на доступ к данным о местоположении (рекомендуется)</translation> <translation id="3538390592868664640">Запретить сайтам создавать 3D-карту места, в котором вы находитесь, и отслеживать положение камеры</translation> <translation id="3551268116566418498">Выйти из режима инкогнито?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Всегда</translation> <translation id="757524316907819857">Запретить сайтам воспроизводить защищенный контент</translation> <translation id="7577900504646297215">Управление интересами</translation> +<translation id="7594634374516752650">Подключено устройство Bluetooth</translation> <translation id="7649070708921625228">Справка</translation> <translation id="7658239707568436148">Отмена</translation> <translation id="7781829728241885113">Вчера</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb index 23ada10..1782727 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">තතු සඟවන්න</translation> <translation id="3328801116991980348">අඩවි තොරතුරු</translation> <translation id="3333961966071413176">සියලු සම්බන්ධතා</translation> +<translation id="3362437373201486687">බ්ලූටූත් උපාංග සඳහා ස්කෑන් කරමින්</translation> <translation id="3386292677130313581">අඩවි වලට ඔබගේ ස්ථානය දැන ගැනීමට ඉඩ දීමට පෙර විමසන්න (නිර්දේශිතයි)</translation> <translation id="3538390592868664640">වෙබ් අඩවිය ඔබේ වටපිටාවේ ත්රිමාන සිතියමක් සෑදීමෙන් හෝ කැමරා ස්ථානය හඹා යෑමෙන් අවහිර කරන්න</translation> <translation id="3551268116566418498">අප්රසිද්ධ ප්රකාර. ඉවත් වන්නද?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">සැමවිටම</translation> <translation id="757524316907819857">ආරක්ෂිත අන්තර්ගත වාදනය කරමින් තිබෙන අඩවි තහනම් කිරීම</translation> <translation id="7577900504646297215">ලැදිකම් කළමනා කරන්න</translation> +<translation id="7594634374516752650">බ්ලූටූත් උපාංගයකට සම්බන්ධ කර ඇත</translation> <translation id="7649070708921625228">උදවු</translation> <translation id="7658239707568436148">අවලංගු කරන්න</translation> <translation id="7781829728241885113">ඊයේ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb index 634ef522..1c9fac7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">தகவலை மறை</translation> <translation id="3328801116991980348">தளம் குறித்த தகவல்</translation> <translation id="3333961966071413176">எல்லாத் தொடர்புகளும்</translation> +<translation id="3362437373201486687">புளூடூத் சாதனங்கள் உள்ளனவா என ஸ்கேன் செய்கிறது</translation> <translation id="3386292677130313581">எனது இருப்பிடத்தை அறிய தளங்களை அனுமதிக்கும் முன் கேள் (பரிந்துரைக்கப்படுகிறது)</translation> <translation id="3538390592868664640">தளங்கள், என்னைச் சுற்றியுள்ள இடங்களின் 3D மேப்பை உருவாக்குவதையும் கேமரா நிலையை டிராக் செய்வதையும் தடு</translation> <translation id="3551268116566418498">மறைநிலையில் இருந்து வெளியேறவா?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">எப்போதும்</translation> <translation id="757524316907819857">பாதுகாக்கப்பட்ட உள்ளடக்கத்தைத் தளங்கள் இயக்குவதைத் தடுக்கும்</translation> <translation id="7577900504646297215">ஆர்வங்களை நிர்வகிக்கும்</translation> +<translation id="7594634374516752650">புளூடூத் சாதனத்தோடு இணைக்கப்பட்டுள்ளது</translation> <translation id="7649070708921625228">உதவி</translation> <translation id="7658239707568436148">ரத்து செய்</translation> <translation id="7781829728241885113">நேற்று</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index a4b6bff..1ae2ee1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Bilgileri Gizle</translation> <translation id="3328801116991980348">Site bilgileri</translation> <translation id="3333961966071413176">Tüm kişiler</translation> +<translation id="3362437373201486687">Bluetooth cihazları taranıyor</translation> <translation id="3386292677130313581">Sitelerin, konumunuzu öğrenmesine izin verilmeden önce size sorulsun (önerilir)</translation> <translation id="3538390592868664640">Sitelerin çevremin 3D haritasını oluşturmasını veya kamera konumunu takip etmesini engelle</translation> <translation id="3551268116566418498">Gizli moddan çıkılsın mı?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Her zaman</translation> <translation id="757524316907819857">Sitelerin korumalı içeriği oynatmasını engellenir</translation> <translation id="7577900504646297215">İlgi alanlarını yönet</translation> +<translation id="7594634374516752650">Bir Bluetooth aygıtına bağlı</translation> <translation id="7649070708921625228">Yardım</translation> <translation id="7658239707568436148">İptal</translation> <translation id="7781829728241885113">Dün</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb index 9686c58..1706744 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">Сховати інформацію</translation> <translation id="3328801116991980348">Інформація про сайт</translation> <translation id="3333961966071413176">Усі контакти</translation> +<translation id="3362437373201486687">Пошук пристроїв із Bluetooth…</translation> <translation id="3386292677130313581">Запитувати, перш ніж дозволити сайтам визначати ваше місцезнаходження (рекомендується)</translation> <translation id="3538390592868664640">Заборонити сайтам створювати 3D-карту вашого оточення або відстежувати положення камери</translation> <translation id="3551268116566418498">Вимкнути анонімний режим?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">Завжди</translation> <translation id="757524316907819857">Заборонити сайтам відтворювати захищений вміст</translation> <translation id="7577900504646297215">Керувати інтересами</translation> +<translation id="7594634374516752650">Підключено до пристрою з Bluetooth</translation> <translation id="7649070708921625228">Довідка</translation> <translation id="7658239707568436148">Скасувати</translation> <translation id="7781829728241885113">Учора</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb index a7d3acc7..3f3777c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">隐藏信息</translation> <translation id="3328801116991980348">网站信息</translation> <translation id="3333961966071413176">所有联系人</translation> +<translation id="3362437373201486687">正在搜寻蓝牙设备</translation> <translation id="3386292677130313581">需先询问,得到许可后才允许网站获取您的位置信息(推荐)</translation> <translation id="3538390592868664640">禁止网站为您的周边环境创建 3D 地图或跟踪摄像头位置</translation> <translation id="3551268116566418498">退出无痕模式?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">永远</translation> <translation id="757524316907819857">禁止网站播放受保护的内容</translation> <translation id="7577900504646297215">管理我的兴趣</translation> +<translation id="7594634374516752650">已连接到蓝牙设备</translation> <translation id="7649070708921625228">帮助</translation> <translation id="7658239707568436148">取消</translation> <translation id="7781829728241885113">昨天</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index aca7bcc0..42e8bda 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">隱藏資料</translation> <translation id="3328801116991980348">網站資料</translation> <translation id="3333961966071413176">所有聯絡人</translation> +<translation id="3362437373201486687">正在掃瞄藍牙裝置</translation> <translation id="3386292677130313581">允許網站存取您的位置前先詢問您 (建議)</translation> <translation id="3538390592868664640">禁止網站建立您身處環境的 3D 地圖或追蹤攝錄機位置</translation> <translation id="3551268116566418498">要退出無痕模式嗎?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">永遠使用</translation> <translation id="757524316907819857">禁止網站播放受保護內容</translation> <translation id="7577900504646297215">管理興趣</translation> +<translation id="7594634374516752650">已連線至藍牙裝置</translation> <translation id="7649070708921625228">說明</translation> <translation id="7658239707568436148">取消</translation> <translation id="7781829728241885113">昨天</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb index bc23e24..b8f6acb0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -101,6 +101,7 @@ <translation id="3295602654194328831">隱藏資訊</translation> <translation id="3328801116991980348">網站資訊</translation> <translation id="3333961966071413176">所有聯絡人</translation> +<translation id="3362437373201486687">正在掃描藍牙裝置</translation> <translation id="3386292677130313581">允許網站存取你的位置資訊前,必須先詢問你 (建議)</translation> <translation id="3538390592868664640">禁止網站根據你的周遭環境建立 3D 地圖或追蹤攝影機位置</translation> <translation id="3551268116566418498">要退出無痕模式嗎?</translation> @@ -271,6 +272,7 @@ <translation id="7561196759112975576">一律使用</translation> <translation id="757524316907819857">禁止網站播放受保護的內容</translation> <translation id="7577900504646297215">管理興趣喜好</translation> +<translation id="7594634374516752650">已連線至藍牙裝置</translation> <translation id="7649070708921625228">說明</translation> <translation id="7658239707568436148">取消</translation> <translation id="7781829728241885113">昨天</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fa.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fa.xtb index 925457293..0299d5bf 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fa.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fa.xtb
@@ -25,7 +25,7 @@ <translation id="3739710162211139054">مرورگر، google</translation> <translation id="4028070048244364234">تغییر، استفاده</translation> <translation id="4204829249546886659">گذرواژهها، امنیت، گذرواژه، ایمنی</translation> -<translation id="4367205929005172598">پیدا کردن تلفن گمشده، دستگاهم را پیدا کن</translation> +<translation id="4367205929005172598">پیدا کردن تلفن گمشده، یافتن دستگاهم</translation> <translation id="4692900934258103694">داخل، درون، برای، نحوه، انجام، در، روی، به، من</translation> <translation id="4878529596268869399">google workspace، google chrome، workspace، مرورگر، g suite، google، chrome</translation> <translation id="4922709528022057939">دایناسور Chrome، بازی دایناسور، بازی دویدن دایناسور</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_lt.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_lt.xtb index 7508b16..86d456bdf 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_lt.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_lt.xtb
@@ -46,6 +46,7 @@ <translation id="7739523284295786564">tvarkyti chrome atsisiuntimus, tvarkyti atsisiuntimus, valdyti atsisiuntimus, peržiūrėti atsisiuntimus</translation> <translation id="7988861522114961979">apklausa, formos, forma, viktorina</translation> <translation id="7992725801741093524">keisti google privatumo nustatymus, tvarkyti google privatumą, valdyti google privatumą</translation> +<translation id="8020024640114692614">visada atidaryti nuorodas chrome, visada naudoti chrome, chrome kaip numatytoji, numatytoji naršyklė, ištrinti safari, kaip nustatyti chrome numatytaja naršykle, pagrindinė naršyklė, nustatyti chrome kaip numatytąją, nustatyti chrome kaip numatytąją naršyklę, atidaryti nuorodas chrome, pasirinkti chrome kaip numatytąją naršyklę, pašalinti safari, ieškoti chrome, įprasta naršyklė</translation> <translation id="8319253638505741466">uždaryti inkognito langą, užbaigti inkognito, išeiti iš inkognito režimo, išeiti iš inkognito</translation> <translation id="8483249620579465383">išnaudoti, suprasti, naršyti, sužinoti, apsilankyti, peržiūrėti</translation> <translation id="8591468627389439293">pastabos, pastaba</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_th.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_th.xtb index 30dc72ac..a035dc8 100644 --- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_th.xtb +++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_th.xtb
@@ -46,6 +46,7 @@ <translation id="7739523284295786564">จัดการการดาวน์โหลดใน Chrome, ดูการดาวน์โหลด</translation> <translation id="7988861522114961979">แบบสำรวจ, ฟอร์ม, แบบฟอร์ม, แบบทดสอบ</translation> <translation id="7992725801741093524">เปลี่ยนการตั้งค่าความเป็นส่วนตัวของ Google, จัดการความเป็นส่วนตัวใน Google</translation> +<translation id="8020024640114692614">เปิดลิงก์ใน chrome ทุกครั้ง, ใช้ chrome เสมอ, chrome เป็นค่าเริ่มต้น, เบราว์เซอร์เริ่มต้น, ลบ safari, วิธีตั้ง chrome เป็นเบราว์เซอร์เริ่มต้น, เบราว์เซอร์หลัก, ตั้ง chrome เป็นค่าเริ่มต้น, ตั้ง chrome เป็นเบราว์เซอร์เริ่มต้น, ตั้ง chrome เป็นเบราว์เซอร์เริ่มต้นของฉัน, เปิดลิงก์ใน chrome, เลือก chrome เป็นเบราว์เซอร์เริ่มต้น, เบราว์เซอร์เบื้องต้น, นำ safari ออก, ค้นหาใน chrome, ตั้ง chrome เป็นค่าเริ่มต้น, กำหนด chrome เป็นเบราว์เซอร์เริ่มต้น, เบราว์เซอร์มาตรฐาน</translation> <translation id="8319253638505741466">ปิดหน้าต่างที่ไม่ระบุตัวตน, สิ้นสุดโหมดไม่ระบุตัวตน</translation> <translation id="8483249620579465383">ใช้ประโยชน์สูงสุดจาก, ทำความเข้าใจ, สำรวจ, ดูข้อมูล, ไปที่, ดู</translation> <translation id="8591468627389439293">โน้ต, บันทึก</translation>
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoContainer.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoContainer.java index 73441e5..c9a9991 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoContainer.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoContainer.java
@@ -60,15 +60,16 @@ } public void setParams(Params params) { + View urlWrapper = findViewById(R.id.page_info_url_wrapper); + initializeUrlView(urlWrapper, params); + mExpandedUrlTitle = findViewById(R.id.page_info_url); - initializeUrlView(mExpandedUrlTitle, params); mExpandedUrlTitle.setUrl(params.url, params.urlOriginLength); // Adjust mExpandedUrlTitle for displaying the non-truncated URL. mExpandedUrlTitle.toggleTruncation(); - mTruncatedUrlTitle = findViewById(R.id.page_info_truncated_url); // Use a separate view for truncated URL display. - initializeUrlView(mTruncatedUrlTitle, params); + mTruncatedUrlTitle = findViewById(R.id.page_info_truncated_url); mTruncatedUrlTitle = findViewById(R.id.page_info_truncated_url); mTruncatedUrlTitle.setText(params.truncatedUrl); @@ -82,7 +83,7 @@ private void initializeUrlView(View view, Params params) { if (params.urlTitleClickCallback != null) { - view.setOnClickListener(v -> { params.urlTitleClickCallback.run(); }); + view.setOnClickListener(v -> params.urlTitleClickCallback.run()); } if (params.urlTitleLongClickCallback != null) { view.setOnLongClickListener(v -> {
diff --git a/components/policy/core/common/cloud/component_cloud_policy_service.cc b/components/policy/core/common/cloud/component_cloud_policy_service.cc index 1961deb..dfa1e50 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_service.cc +++ b/components/policy/core/common/cloud/component_cloud_policy_service.cc
@@ -27,13 +27,12 @@ #include "components/policy/core/common/cloud/resource_cache.h" #include "components/policy/core/common/schema.h" #include "components/policy/core/common/schema_map.h" +#include "components/policy/core/common/values_util.h" #include "components/policy/proto/device_management_backend.pb.h" #include "services/network/public/cpp/shared_url_loader_factory.h" namespace em = enterprise_management; -using ComponentPolicyMap = - policy::ComponentCloudPolicyServiceObserver::ComponentPolicyMap; using ScopedResponseMap = std::unordered_map<policy::PolicyNamespace, em::PolicyFetchResponse, policy::PolicyNamespaceHash>; @@ -208,9 +207,8 @@ bundle->CopyFrom(store_.policy()); service_task_runner_->PostTask( FROM_HERE, - base::BindOnce( - &ComponentCloudPolicyService::SetPolicy, service_, std::move(bundle), - std::make_unique<ComponentPolicyMap>(store_.serialized_policy()))); + base::BindOnce(&ComponentCloudPolicyService::SetPolicy, service_, + std::move(bundle), store_.GetJsonPolicyMap())); initialized_ = true; @@ -241,9 +239,8 @@ bundle->CopyFrom(store_.policy()); service_task_runner_->PostTask( FROM_HERE, - base::BindOnce( - &ComponentCloudPolicyService::SetPolicy, service_, std::move(bundle), - std::make_unique<ComponentPolicyMap>(store_.serialized_policy()))); + base::BindOnce(&ComponentCloudPolicyService::SetPolicy, service_, + std::move(bundle), store_.GetJsonPolicyMap())); } void ComponentCloudPolicyService::Backend::UpdateWithLastFetchedPolicy() { @@ -510,13 +507,13 @@ void ComponentCloudPolicyService::SetPolicy( std::unique_ptr<PolicyBundle> policy, - std::unique_ptr<ComponentPolicyMap> serialized_policy) { + const ComponentPolicyMap& component_policy) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Store the current unfiltered policies. unfiltered_policy_ = std::move(policy); - NotifyComponentPolicyUpdated(std::move(serialized_policy)); + NotifyComponentPolicyUpdated(component_policy); FilterAndInstallPolicy(); } @@ -539,9 +536,9 @@ } void ComponentCloudPolicyService::NotifyComponentPolicyUpdated( - std::unique_ptr<ComponentPolicyMap> serialized_policy) { + const ComponentPolicyMap& component_policy) { for (auto& observer : observers_) { - observer.OnComponentPolicyUpdated(*serialized_policy); + observer.OnComponentPolicyUpdated(component_policy); } }
diff --git a/components/policy/core/common/cloud/component_cloud_policy_service.h b/components/policy/core/common/cloud/component_cloud_policy_service.h index b705ad4..89ebb4f 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_service.h +++ b/components/policy/core/common/cloud/component_cloud_policy_service.h
@@ -22,6 +22,7 @@ #include "components/policy/core/common/policy_namespace.h" #include "components/policy/core/common/policy_types.h" #include "components/policy/core/common/schema_registry.h" +#include "components/policy/core/common/values_util.h" #include "components/policy/policy_export.h" namespace base { @@ -148,14 +149,10 @@ void UpdateFromClient(); void UpdateFromSchemaRegistry(); void Disconnect(); - void SetPolicy( - std::unique_ptr<PolicyBundle> policy, - std::unique_ptr<ComponentCloudPolicyServiceObserver::ComponentPolicyMap> - serialized_policy); + void SetPolicy(std::unique_ptr<PolicyBundle> policy, + const ComponentPolicyMap& component_policy); void FilterAndInstallPolicy(); - void NotifyComponentPolicyUpdated( - std::unique_ptr<ComponentCloudPolicyServiceObserver::ComponentPolicyMap> - serialized_policy); + void NotifyComponentPolicyUpdated(const ComponentPolicyMap& component_policy); std::string policy_type_; raw_ptr<Delegate> delegate_;
diff --git a/components/policy/core/common/cloud/component_cloud_policy_service_observer.h b/components/policy/core/common/cloud/component_cloud_policy_service_observer.h index 80562a53..48e5e4c 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_service_observer.h +++ b/components/policy/core/common/cloud/component_cloud_policy_service_observer.h
@@ -6,6 +6,7 @@ #define COMPONENTS_POLICY_CORE_COMMON_CLOUD_COMPONENT_CLOUD_POLICY_SERVICE_OBSERVER_H_ #include "components/policy/core/common/policy_namespace.h" +#include "components/policy/core/common/values_util.h" namespace policy { @@ -15,16 +16,12 @@ class POLICY_EXPORT ComponentCloudPolicyServiceObserver : public base::CheckedObserver { public: - using ComponentPolicyMap = - base::flat_map<policy::PolicyNamespace, std::vector<uint8_t>>; - ~ComponentCloudPolicyServiceObserver() override = default; // Called on changes to store->policy() and/or store->policy_map(). The - // values in the `serialized_policy` map are the serialized - // PolicyFetchResponse objects received from the server. + // values in the `policy` map are the JSON data received from the server. virtual void OnComponentPolicyUpdated( - const ComponentPolicyMap& serialized_policy) = 0; + const ComponentPolicyMap& component_policy) = 0; virtual void OnComponentPolicyServiceDestruction( ComponentCloudPolicyService* service) = 0; };
diff --git a/components/policy/core/common/cloud/component_cloud_policy_store.cc b/components/policy/core/common/cloud/component_cloud_policy_store.cc index 60d7925..265dcbb 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_store.cc +++ b/components/policy/core/common/cloud/component_cloud_policy_store.cc
@@ -80,6 +80,25 @@ return nullptr; } +base::Value::Dict TranslatePolicyMapEntryToJson(const PolicyMap::Entry& entry) { + base::Value::Dict result; + // This is actually safe because this code just copies the value, + // not caring about its type. + result.Set(kValue, entry.value_unsafe()->Clone()); + if (entry.level == POLICY_LEVEL_RECOMMENDED) { + result.Set(kLevel, base::StringPiece(kRecommended)); + } + return result; +} + +base::Value::Dict TranslatePolicyMapToJson(const PolicyMap& policy_map) { + base::Value::Dict result; + for (const auto& [key, entry] : policy_map) { + result.Set(key, TranslatePolicyMapEntryToJson(entry)); + } + return result; +} + } // namespace ComponentCloudPolicyStore::Delegate::~Delegate() = default; @@ -197,9 +216,6 @@ cached_hashes_[ns] = payload.secure_hash(); stored_policy_times_[ns] = base::Time::FromJavaTime(policy_data.timestamp()); - - serialized_policy_[ns] = - std::vector<uint8_t>(it->second.begin(), it->second.end()); } delegate_->OnComponentCloudPolicyStoreUpdated(); } @@ -232,8 +248,6 @@ policy_bundle_.Get(ns).Swap(&policy); cached_hashes_[ns] = secure_hash; stored_policy_times_[ns] = base::Time::FromJavaTime(policy_data->timestamp()); - serialized_policy_[ns] = - std::vector<uint8_t>(serialized_policy.begin(), serialized_policy.end()); delegate_->OnComponentCloudPolicyStoreUpdated(); return true; } @@ -250,7 +264,6 @@ if (!policy_bundle_.Get(ns).empty()) { policy_bundle_.Get(ns).Clear(); - serialized_policy_.erase(ns); delegate_->OnComponentCloudPolicyStoreUpdated(); } } @@ -286,7 +299,6 @@ cached_hashes_.erase(prev); DCHECK(stored_policy_times_.count(ns)); stored_policy_times_.erase(ns); - serialized_policy_.erase(ns); } else { ++it; } @@ -305,7 +317,6 @@ cached_hashes_.clear(); stored_policy_times_.clear(); - serialized_policy_.clear(); const PolicyBundle empty_bundle; if (!policy_bundle_.Equals(empty_bundle)) { policy_bundle_.Clear(); @@ -463,4 +474,13 @@ return true; } +ComponentPolicyMap ComponentCloudPolicyStore::GetJsonPolicyMap() { + ComponentPolicyMap result; + for (const auto& [policy_namespace, policy_map] : policy_bundle_) { + result[policy_namespace] = + base::Value(TranslatePolicyMapToJson(policy_map)); + } + return result; +} + } // namespace policy
diff --git a/components/policy/core/common/cloud/component_cloud_policy_store.h b/components/policy/core/common/cloud/component_cloud_policy_store.h index a1f59299..f63a426 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_store.h +++ b/components/policy/core/common/cloud/component_cloud_policy_store.h
@@ -16,6 +16,7 @@ #include "components/policy/core/common/policy_bundle.h" #include "components/policy/core/common/policy_namespace.h" #include "components/policy/core/common/policy_types.h" +#include "components/policy/core/common/values_util.h" #include "components/policy/policy_export.h" namespace enterprise_management { @@ -78,11 +79,8 @@ // The current list of policies. const PolicyBundle& policy() const { return policy_bundle_; } - // Returns the map of serialized policy for each namespace. - const base::flat_map<PolicyNamespace, std::vector<uint8_t>>& - serialized_policy() { - return serialized_policy_; - } + // Returns the map of JSON policy value for each namespace. + ComponentPolicyMap GetJsonPolicyMap(); // The cached hash for namespace |ns|, or the empty string if |ns| is not // cached. @@ -174,9 +172,6 @@ // Mapping from policy namespace to policy timestamp for each currently // exposed component. std::map<PolicyNamespace, base::Time> stored_policy_times_; - // Mapping from policy namespace to serialized policy data for each currently - // exposed component. Only the policy that passed the validation is stored. - base::flat_map<PolicyNamespace, std::vector<uint8_t>> serialized_policy_; raw_ptr<const DomainConstants> domain_constants_;
diff --git a/components/policy/core/common/values_util.cc b/components/policy/core/common/values_util.cc index c2b269f..5254b66 100644 --- a/components/policy/core/common/values_util.cc +++ b/components/policy/core/common/values_util.cc
@@ -25,4 +25,12 @@ return base::flat_set<std::string>(std::move(item_vector)); } +ComponentPolicyMap CopyComponentPolicyMap(const ComponentPolicyMap& map) { + ComponentPolicyMap new_map; + for (const auto& [policy_namespace, value] : map) { + new_map[policy_namespace] = value.Clone(); + } + return new_map; +} + } // namespace policy
diff --git a/components/policy/core/common/values_util.h b/components/policy/core/common/values_util.h index 2134f00..025d8b2 100644 --- a/components/policy/core/common/values_util.h +++ b/components/policy/core/common/values_util.h
@@ -9,15 +9,28 @@ #include "base/containers/flat_set.h" #include "base/values.h" +#include "components/policy/core/common/policy_namespace.h" #include "components/policy/policy_export.h" namespace policy { +// A map that represents component policy values as downloaded by the server. +// The key is the component represented as a PolicyNamespace (e.g. a chrome +// extension). +// The value is a JSON value in the format understood by ComponentPolicyStore +// (Chrome OS section of +// https://www.chromium.org/administrators/configuring-policy-for-extensions/) +using ComponentPolicyMap = base::flat_map<PolicyNamespace, base::Value>; + // Converts a list of string value to string flat set. Returns empty // set if |value| is not set. Non-string items will be ignored. POLICY_EXPORT base::flat_set<std::string> ValueToStringSet( const base::Value* value); +// Returns a copy of provided map. +POLICY_EXPORT ComponentPolicyMap +CopyComponentPolicyMap(const ComponentPolicyMap& map); + } // namespace policy #endif // COMPONENTS_POLICY_CORE_COMMON_VALUES_UTIL_H_
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 624c4a8..7f507dcc 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -3710,6 +3710,16 @@ <translation id="5179853299156742425">URL, über die die Desktopvorlage heruntergeladen werden kann.</translation> <translation id="5182055907976889880">Google Drive in <ph name="PRODUCT_OS_NAME" /> konfigurieren</translation> <translation id="5182483318861266793">Ablage auf der rechten Seite des Bildschirms anzeigen</translation> +<translation id="5184298474980725716">Diese Richtlinie legt die Sichtbarkeit von Onlinerecherchen auf der Chrome-Verlaufsseite fest. + + Wenn die Richtlinie aktiviert ist, sind Onlinerecherchen unter chrome://history/journeys sichtbar. + + Ist sie deaktiviert, sind Onlinerecherchen nicht unter chrome://history/journeys sichtbar. + + Ist die Richtlinie nicht konfiguriert, sind Onlinerecherchen standardmäßig unter chrome://history/journeys sichtbar und Nutzer können die Sichtbarkeit von Onlinerecherchen ändern. + + Hinweis: Wenn die Richtlinie <ph name="COMPONENT_UPDATES_ENABLED_POLICY_NAME" /> deaktiviert, <ph name="HISTORY_CLUSTERS_VISIBLE_POLICY_NAME" /> jedoch aktiviert oder nicht konfiguriert ist, sind Onlinerecherchen unter chrome://history/journeys verfügbar, möglicherweise aber nicht in der Omnibox. Außerdem können sie weniger relevant für den Nutzer sein. + </translation> <translation id="51859390023061147">Funktion zur vollständigen Wiederherstellung deaktivieren.</translation> <translation id="5189360528842591274">Verbindung nur zu den Bluetooth-Diensten in der Liste erlauben</translation> <translation id="5190426551516379357">Wenn die Richtlinie konfiguriert ist, wird ein minimaler eingeschränkter Modus auf YouTube erzwungen und verhindert, dass Nutzer einen weniger eingeschränkten Modus auswählen. Wird diese Richtlinie
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 7c8b2129..5a84d9ca6 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -108,7 +108,7 @@ Si se le asigna un valor a esta política, los usuarios no podrán cambiarlo.</translation> <translation id="1123650965531933634">Niega el permiso de colocación de ventanas en todos los sitios de forma predeterminada</translation> -<translation id="1133622335785078255">Permite que los usuarios creen y utilicen perfiles secundarios, y que usen el modo Invitados en el navegador <ph name="LACROS_NAME" /></translation> +<translation id="1133622335785078255">Permite que los usuarios creen y utilicen perfiles secundarios, y que usen el modo Invitado en el navegador <ph name="LACROS_NAME" /></translation> <translation id="1133814529606590009">Si se habilita esta política, siempre estará activa la recogida de datos anónima con clave de URL, que enviará las URL de las páginas que el usuario visite a Google para mejorar las búsquedas y la navegación. Si se inhabilita esta política, no se activará la recogida de datos anónima con clave de URL. @@ -297,7 +297,7 @@ <translation id="13356285923490863">Nombre de la política</translation> <translation id="1338603603553894503">Especifica si el selector de perfil se habilita, se inhabilita o se fuerza al iniciar el navegador. - De forma predeterminada no se muestra el selector de perfil si se dan las siguientes situaciones: el navegador se inicia en el modo Invitados o de incógnito, se especifica un directorio de perfil o URLs en línea de comandos, se solicita explícitamente abrir una aplicación, una notificación nativa abre el navegador, solo hay un perfil disponible o se le asigna el valor "true" a la política ForceBrowserSignin. + De forma predeterminada no se muestra el selector de perfil si se dan las siguientes situaciones: el navegador se inicia en el modo Invitado o de incógnito, se especifica un directorio de perfil o URLs en línea de comandos, se solicita explícitamente abrir una aplicación, una notificación nativa abre el navegador, solo hay un perfil disponible o se le asigna el valor "true" a la política ForceBrowserSignin. Si se selecciona "Habilitado" (0) o no se establece la política, el selector de perfil se mostrará de forma predeterminada al inicio, pero los usuarios podrán habilitarlo o inhabilitarlo. @@ -607,7 +607,7 @@ Si no se le asigna ningún valor, se utilizará el tamaño de caché predeterminado y los usuarios podrán cambiarlo con el indicador "--media-cache-size".</translation> <translation id="1648816843164517573">Lista de nombres que omitirán la comprobación de la política de HSTS</translation> -<translation id="1654087023995670109">Forzar el modo Invitados en el navegador</translation> +<translation id="1654087023995670109">Forzar el modo Invitado en el navegador</translation> <translation id="1655229863189977773">Establecer tamaño de caché de disco en bytes</translation> <translation id="165769015320654523">Concede permiso automáticamente a estos sitios para que se conecten a dispositivos HID con los IDs de proveedor y producto facilitados.</translation> <translation id="166427968280387991">Servidor proxy</translation> @@ -1057,7 +1057,7 @@ <translation id="2061810934846663491">Configurar los nombres de dominio obligatorios para hosts de acceso remoto</translation> <translation id="2069350366303315077">Si se habilita la política, <ph name="PRODUCT_NAME" /> usará sesiones de invitado e impedirá inicios de sesión de perfiles. Las sesiones de invitado son perfiles de <ph name="PRODUCT_NAME" /> en los que las ventanas están en modo Incógnito. - Si se inhabilita la política, no se establece o se inhabilita el modo Invitados del navegador (mediante <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" />), se permitirá el uso de perfiles nuevos y de perfiles ya existentes.</translation> + Si se inhabilita la política, no se establece o se inhabilita el modo Invitado del navegador (mediante <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" />), se permitirá el uso de perfiles nuevos y de perfiles ya existentes.</translation> <translation id="2070744136203607632">No realizar comprobaciones de interceptación de DNS</translation> <translation id="2073552873076775140">Permitir inicio de sesión en <ph name="PRODUCT_NAME" /></translation> <translation id="2075732129949889165">Playbook de Ansible para Crostini</translation> @@ -2875,7 +2875,7 @@ Estas restricciones se aplican a las descargas activadas desde el contenido de las páginas web o a través de la opción "Descargar enlace" del menú. No se aplican a la opción para guardar o descargar de la página actual ni a la opción para guardar como PDF de las opciones de impresión. En <ph name="MS_WIN_NAME" />, esta función solo está disponible en instancias que estén vinculadas a un dominio de <ph name="MS_AD_NAME" /> que se ejecuten en Windows 10 Pro o que se hayan registrado en <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />. En <ph name="MAC_OS_NAME" />, esta función solo está disponible en instancias que se gestionen mediante MDM o que estén vinculadas a un dominio a través de MCX.</translation> -<translation id="4043796890723386527">Evita que los usuarios creen y utilicen perfiles secundarios, y que usen el modo Invitados en el navegador <ph name="LACROS_NAME" />.</translation> +<translation id="4043796890723386527">Evita que los usuarios creen y utilicen perfiles secundarios, y que usen el modo Invitado en el navegador <ph name="LACROS_NAME" />.</translation> <translation id="4051723201852944592">Habilitar la oclusión de ventana</translation> <translation id="4056910949759281379">Inhabilitar protocolo SPDY</translation> <translation id="4061107397839125009">Si se establece la política, podrás definir una lista de patrones de URL donde se especifique qué sitios no pueden mostrar notificaciones. @@ -3607,13 +3607,13 @@ Si se le asigna un valor a esta política, los usuarios no podrán cambiarlo. Si no se le asigna ningún valor, los usuarios podrán decidir si quieren enviar informes o no. Consulta más información sobre Navegación segura en https://developers.google.com/safe-browsing.</translation> -<translation id="4955566229684195326">Esta opción permite que los usuarios creen y utilicen perfiles secundarios, y que usen el modo Invitados en el navegador <ph name="LACROS_NAME" />. +<translation id="4955566229684195326">Esta opción permite que los usuarios creen y utilicen perfiles secundarios, y que usen el modo Invitado en el navegador <ph name="LACROS_NAME" />. - Al igual que en el caso de <ph name="BROWSER_ADD_PERSON_ENABLED_POLICY_NAME" /> y <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" />, si se asigna el valor false a esta política o no se le asigna ningún valor, el usuario no podrá crear ni utilizar perfiles secundarios, ni usar el modo Invitados. Los perfiles secundarios creados anteriormente (si los hubiera) no estarán disponibles. + Al igual que en el caso de <ph name="BROWSER_ADD_PERSON_ENABLED_POLICY_NAME" /> y <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" />, si se asigna el valor false a esta política o no se le asigna ningún valor, el usuario no podrá crear ni utilizar perfiles secundarios, ni usar el modo Invitado. Los perfiles secundarios creados anteriormente (si los hubiera) no estarán disponibles. - Si se le asigna el valor true, el usuario podrá crear y utilizar perfiles secundarios, y usar el modo Invitados. + Si se le asigna el valor true, el usuario podrá crear y utilizar perfiles secundarios, y usar el modo Invitado. - Nota: Si se le asigna el valor true a esta política, pero <ph name="BROWSER_ADD_PERSON_ENABLED_POLICY_NAME" /> tiene asignado el valor false, el usuario no podrá crear perfiles secundarios. Ocurre lo mismo con <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" /> y el modo Invitados.</translation> + Nota: Si se le asigna el valor true a esta política, pero <ph name="BROWSER_ADD_PERSON_ENABLED_POLICY_NAME" /> tiene asignado el valor false, el usuario no podrá crear perfiles secundarios. Ocurre lo mismo con <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" /> y el modo Invitado.</translation> <translation id="4960597185231686653">Un indicador booleano que especifica si el teclado en pantalla permite usar la función de entrada de voz.</translation> <translation id="4970046075219007744">Permite que las aplicaciones web soliciten al usuario que les conceda acceso a ciertos tipos de archivo a través de la API File Handling</translation> <translation id="4970855112942626932">Inhabilitar inicio de sesión en el navegador</translation> @@ -4095,7 +4095,7 @@ Esta política afecta a los usuarios que se hayan autenticado mediante SAML. El valor de esta política debe especificarse en número de días.</translation> -<translation id="5457065417344056871">Habilitar el modo Invitados en el navegador</translation> +<translation id="5457065417344056871">Habilitar el modo Invitado en el navegador</translation> <translation id="5457387982448145430">Si se asigna el valor "Habilitada" a esta política, se importarán las contraseñas guardadas del navegador predeterminado anterior al ejecutarse por primera vez. Si se le asigna el valor "Inhabilitada" o no se le asigna ninguno, no se importará ninguna contraseña al ejecutarse por primera vez. Los usuarios pueden abrir un cuadro de diálogo de importación y la casilla de contraseñas guardadas aparecerá marcada o desmarcada en función del valor de esta política.</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 6caf584d..183df2b6 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -88,7 +88,7 @@ <translation id="1077675271127011209">Disattiva i report sull'utilizzo e sui dati relativi agli arresti anomali</translation> <translation id="1079425471279127373">La configurazione di questo criterio consente di stabilire se consentire o meno ad alcune origini delle applicazioni web con installazione forzata di ricevere gli attributi dei dispositivi (ad esempio, numero di serie, nome host) usando l'API Device Attributes. - L'API Device Attributes è un elenco di API web; visita la pagina https://wicg.github.io/WebApiDevice/device_attributes. Sono disponibili soltanto per le origini che corrispondono ad applicazioni web con installazione forzata tramite <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> o per quella configurata nella sessione Kiosk.</translation> + L'API Device Attributes è un elenco di API web; visita la pagina https://wicg.github.io/WebApiDevice/device_attributes. Sono disponibili soltanto per le origini che corrispondono ad applicazioni web con installazione forzata tramite <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> o per quella configurata nella sessione kiosk.</translation> <translation id="1079801999187584280">Non consentire l'utilizzo degli Strumenti per sviluppatori</translation> <translation id="1082802595100075771">Consenti agli utenti di scegliere un servizio Google anonimo per fornire descrizioni automatiche alle immagini senza etichetta</translation> <translation id="1087437665304381368">Questa norma consente di controllare esclusivamente la modalità sviluppatore di <ph name="PRODUCT_OS_NAME" />. Se vuoi impedire l'accesso alle Opzioni sviluppatore Android, devi impostare la norma <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" />.</translation> @@ -5534,7 +5534,7 @@ Se il criterio non viene impostato, la barra delle app verrà posizionata per impostazione predefinita nella parte inferiore dello schermo, ma l'utente potrà cambiare la posizione.</translation> <translation id="7039815268521168329">Mostrare il flusso Voice Match dell'Assistente Google durante la configurazione iniziale</translation> <translation id="7040229947030068419">Valore di esempio:</translation> -<translation id="7041170641363384736">Consente di impostare una programmazione personalizzata per il riavvio dei dispositivi. Attualmente il criterio viene applicato soltanto ai dispositivi per cui è stato attivato l'avvio automatico dell'app nella sessione Kiosk. Se viene impostato su Vero, il dispositivo verrà riavviato in base alla programmazione. Il criterio deve essere rimosso per annullare ulteriori riavvii programmati.</translation> +<translation id="7041170641363384736">Consente di impostare una programmazione personalizzata per il riavvio dei dispositivi. Attualmente il criterio viene applicato soltanto ai dispositivi per cui è stato attivato l'avvio automatico dell'app nella sessione kiosk. Se viene impostato su True, il dispositivo verrà riavviato in base alla programmazione. Il criterio deve essere rimosso per annullare ulteriori riavvii programmati.</translation> <translation id="7044883996351280650">Controlla il servizio backup e ripristino di Android</translation> <translation id="7047495632846973438">Specifica se i criteri relativi alle autorizzazioni dell'acquisizione del display vengono controllati o saltati.</translation> <translation id="7066292150801784098">Disattiva l'interazione degli utenti remoti con finestre con privilegi più elevati nelle sessioni di assistenza remota</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 0b308b5..a44dedc 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -3751,6 +3751,16 @@ <translation id="5179853299156742425">데스크 템플릿을 다운로드할 수 있는 URL입니다.</translation> <translation id="5182055907976889880"><ph name="PRODUCT_OS_NAME" />에서 Google Drive를 구성합니다.</translation> <translation id="5182483318861266793">실행기를 화면 오른쪽에 놓기</translation> +<translation id="5184298474980725716">이 정책은 Chrome 방문 기록 페이지에 탐색 여정을 표시할지를 지정합니다. + + 정책을 사용으로 설정하면 chrome://history/journeys에서 탐색 여정이 표시되고, + + 사용 중지로 설정하면 chrome://history/journeys에서 탐색 여정이 표시되지 않습니다. + + 정책을 설정하지 않으면 탐색 여정이 기본적으로 chrome://history/journeys에 표시되며 사용자가 탐색 여정의 표시 여부를 변경할 수 있습니다. + + 참고: <ph name="COMPONENT_UPDATES_ENABLED_POLICY_NAME" /> 정책을 사용 중지로 설정했지만 <ph name="HISTORY_CLUSTERS_VISIBLE_POLICY_NAME" /> 정책은 사용으로 설정하거나 설정하지 않은 경우, 탐색 여정이 chrome://history/journeys에는 표시되지만 검색주소창에는 표시되지 않을 수 있으며 사용자와의 관련성이 떨어질 가능성이 있습니다. + </translation> <translation id="51859390023061147">전체 복원 기능 사용 안함</translation> <translation id="5189360528842591274">목록에 있는 블루투스 서비스 연결만 허용</translation> <translation id="5190426551516379357">이 정책을 설정하면 YouTube에서 최소 제한 모드가 실행되며 사용자가 이보다 낮은 수준의 제한 모드를 선택하지 못하게 합니다. 정책 설정과 그 결과는 다음과 같습니다.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index c307ca5..d6ade93c 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -3738,6 +3738,16 @@ <translation id="5179853299156742425">O URL no qual o download do modelo de espaço de trabalho pode ser feito.</translation> <translation id="5182055907976889880">Configura o Google Drive no <ph name="PRODUCT_OS_NAME" />.</translation> <translation id="5182483318861266793">Posicionar a estante no lado direito da tela</translation> +<translation id="5184298474980725716">Esta política controla a visibilidade de jornadas na página do histórico do Chrome. + + Se ela for ativada, as jornadas vão ficar visíveis em chrome://history/journeys. + + Se for desativada, isso não vai acontecer. + + Se a política for deixada sem definição, as jornadas vão ficar visíveis em chrome://history/journeys por padrão e os usuários poderão mudar a visibilidade. + + Se a política <ph name="COMPONENT_UPDATES_ENABLED_POLICY_NAME" /> for desativada, mas a <ph name="HISTORY_CLUSTERS_VISIBLE_POLICY_NAME" /> for ativada ou deixada sem definição, as jornadas ainda vão ficar disponíveis em chrome://history/journeys, mas talvez não estejam na omnibox e sejam menos relevantes para o usuário. + </translation> <translation id="51859390023061147">Desativar o recurso de restauração completa.</translation> <translation id="5189360528842591274">Permitir conexão apenas com os serviços Bluetooth na lista</translation> <translation id="5190426551516379357">Se a política for definida, um nível mínimo do Modo restrito será aplicado ao YouTube e os usuários não poderão escolher um modo menos restrito. Se for definida como:
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 4d105cf1..01cac86d 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -3686,6 +3686,16 @@ <translation id="5179853299156742425">URL ที่ไปดาวน์โหลดเทมเพลตเดสก์ได้</translation> <translation id="5182055907976889880">กำหนดค่า Google ไดรฟ์ใน <ph name="PRODUCT_OS_NAME" /></translation> <translation id="5182483318861266793">กำหนดตำแหน่งชั้นวางให้อยู่ที่ด้านขวาของหน้าจอ</translation> +<translation id="5184298474980725716">นโยบายนี้จะควบคุมการแสดงเส้นทางการท่องเว็บบนหน้าประวัติการเข้าชมใน Chrome + + หากตั้งค่านโยบายเป็น "เปิดใช้" เส้นทางการท่องเว็บจะแสดงที่ chrome://history/journeys + + หากตั้งค่านโยบายเป็น "ปิดใช้" เส้นทางการท่องเว็บจะไม่แสดงที่ chrome://history/journeys + + หากไม่ได้ตั้งค่านโยบาย เส้นทางการท่องเว็บจะแสดงที่ chrome://history/journeys โดยค่าเริ่มต้น และผู้ใช้จะเปลี่ยนการแสดงเส้นทางการท่องเว็บได้ + + โปรดทราบว่าหากตั้งค่านโยบาย <ph name="COMPONENT_UPDATES_ENABLED_POLICY_NAME" /> เป็น "ปิดใช้" แต่ตั้งค่า <ph name="HISTORY_CLUSTERS_VISIBLE_POLICY_NAME" /> เป็น "เปิดใช้" หรือไม่ได้ตั้งค่า ผู้ใช้จะยังดูเส้นทางการท่องเว็บได้ที่ chrome://history/journeys แต่อาจไม่แสดงในแถบอเนกประสงค์และมีความเกี่ยวข้องกับผู้ใช้น้อยลง + </translation> <translation id="51859390023061147">ปิดใช้ฟีเจอร์การคืนค่าโดยสมบูรณ์</translation> <translation id="5189360528842591274">อนุญาตการเชื่อมต่อกับบริการบลูทูธในรายการเท่านั้น</translation> <translation id="5190426551516379357">การตั้งค่านโยบายจะบังคับใช้โหมดที่จำกัดขั้นต่ำใน YouTube และป้องกันไม่ให้ผู้ใช้เลือกโหมดที่จำกัดต่ำกว่านี้ หากตั้งค่านี้เป็น
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index c75976a..1601a0eb 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -4776,9 +4776,9 @@ <translation id="6282799760374509080">Дозволити чи заборонити запис аудіо</translation> <translation id="6284362063448764300">TLS 1.1</translation> <translation id="6287310684159482272">Налаштування файлів сookie</translation> -<translation id="6300871921951390976">Якщо для цього правила вибрано значення True, користувачі можуть змінювати лише версію оновлення для цього пристрою. Якщо для цього правила вибрано значення False або його не налаштовано, користувачі не можуть змінювати цю версію. +<translation id="6300871921951390976">Користувачі можуть змінювати версію оновлення для пристрою, лише якщо для цього правила вибрано значення True. Якщо для цього правила вибрано значення False або його не налаштовано, користувачі не можуть змінювати цю версію. - Налаштування правила <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> діють, лише якщо для <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> вибрано значення False.</translation> +Налаштування правила <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> діють, лише якщо для <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> вибрано значення False.</translation> <translation id="6305373713165475629">Якщо ввімкнути це правило, воно замінить стандартні параметри кольорового друку. Якщо такий режим недоступний, це правило ігнорується.</translation> <translation id="6310223829319187614">Увімкнути автозавершення назви домену під час входу користувача</translation> <translation id="631081324835911099">Примусово виходити з основного облікового запису користувача, коли маркер автентифікації стає недійсним.
diff --git a/components/services/storage/public/mojom/indexed_db_control.mojom b/components/services/storage/public/mojom/indexed_db_control.mojom index 0300362..9f1b4b8 100644 --- a/components/services/storage/public/mojom/indexed_db_control.mojom +++ b/components/services/storage/public/mojom/indexed_db_control.mojom
@@ -4,6 +4,7 @@ module storage.mojom; +import "components/services/storage/public/mojom/buckets/bucket_locator.mojom"; import "components/services/storage/public/mojom/indexed_db_control_test.mojom"; import "components/services/storage/public/mojom/storage_policy_update.mojom"; import "components/services/storage/public/mojom/storage_usage_info.mojom"; @@ -25,15 +26,17 @@ // enums.xml. }; -// Communicates with IndexedDB clients about changes in IndexedDB. +// Communicates with IndexedDB clients about changes in IndexedDB. These clients +// should live in the browser process as the notifications are dispatched by the +// storage service without filtering by frame. interface IndexedDBObserver { // This function is called when the size of the usage for a particular - // `storage_key` changes (both in memory and on disk). - OnIndexedDBListChanged(blink.mojom.StorageKey storage_key); + // `bucket_locator` changes (both in memory and on disk). + OnIndexedDBListChanged(storage.mojom.BucketLocator bucket_locator); // This function is called when the content of a particular object store - // for a particular `storage_key` has been modified. - OnIndexedDBContentChanged(blink.mojom.StorageKey storage_key, + // for a particular `bucket_locator` has been modified. + OnIndexedDBContentChanged(storage.mojom.BucketLocator bucket_locator, mojo_base.mojom.String16 database_name, mojo_base.mojom.String16 object_store_name); };
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index c23fc2a..6a06062 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Bestuur</translation> <translation id="3816482573645936981">Waarde (vervang)</translation> <translation id="382518646247711829">As jy 'n instaanbediener gebruik …</translation> +<translation id="3826050100957962900">Derdeparty-aanmelding</translation> <translation id="3827112369919217609">Absoluut</translation> <translation id="3827666161959873541">Gesinsflieks</translation> <translation id="3828924085048779000">Leë wagfrase word nie toegelaat nie.</translation> @@ -1334,6 +1335,7 @@ <translation id="4607603470419975064">Sien Chrome-wenke-knoppie; druk Enter om meer oor Chrome-kenmerke te wete te kom</translation> <translation id="4607608436550361748">Sien Chrome-wenke</translation> <translation id="4617273035598175554">Grafika- en animasiesagteware</translation> +<translation id="4627165777145349100">Meer oor hierdie bladsy</translation> <translation id="4627675673814409125">Hierdie beleid kan nie op die Chrome-profielvlak gestel word nie en sal geïgnoreer word.</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4631649115723685955">Kontantterugbetaling is gekoppel</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index fab3742..9d829ccb 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -1050,6 +1050,7 @@ <translation id="3810973564298564668">አደራጅ</translation> <translation id="3816482573645936981">እሴት (የተተካ)</translation> <translation id="382518646247711829">ተኪ አገልጋይ የሚጠቀሙ ከሆኑ...</translation> +<translation id="3826050100957962900">የሶስተኛ ወገን መግቢያ</translation> <translation id="3827112369919217609">ፍጹም</translation> <translation id="3827666161959873541">የቤተሰብ ፊልሞች</translation> <translation id="3828924085048779000">ባዶ የይለፍ ሐረግ አይፈቀድም።</translation> @@ -1059,6 +1060,7 @@ <translation id="3835233591525155343">የእርስዎ መሣሪያ አጠቃቀም</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ አዲስ Google ሰነድ በፍጥነት ለመፍጠር ትርን ከዚያ አስገባን ይጫኑ</translation> <translation id="385051799172605136">ተመለስ</translation> +<translation id="3851515670389017037">ጉዞዎች ተዘግተዋል</translation> <translation id="3858027520442213535">ቀን እና ሰዓትን አዘምን</translation> <translation id="3858860766373142691">ስም</translation> <translation id="3872834068356954457">ሳይንስ</translation> @@ -1356,6 +1358,7 @@ <translation id="470284880436071933">ወንጀል እና ፍትህ</translation> <translation id="4704732901923281920">የስነ ህይወት ሳይንሶች</translation> <translation id="4708268264240856090">የእርስዎ ግንኙነት ተቋርጧል</translation> +<translation id="4709819737903924300">ጉዞዎች በሙሉ ከፍታ ላይ ተከፍተዋል</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />የWindows አውታረ መረብ መመርመሪያን በማሄድ ላይ<ph name="END_LINK" /></translation> <translation id="4722735765955348426">የ<ph name="USERNAME" /> ይለፍ ቃል</translation> @@ -1819,6 +1822,7 @@ <translation id="5989320800837274978">ቋሚ ተኪ አገልጋዮችም ሆኑ የ.pac ስክሪፕት ዩአርኤል አልተገለጹም።</translation> <translation id="5992691462791905444">Z-እጥፋትን በመቀየስ ላይ</translation> <translation id="5995727681868049093">በGoogle መለያዎ ውስጥ የእርስዎን መረጃ፣ ግላዊነት እና ደህንነት ያስተዳድሩ</translation> +<translation id="5997247540087773573">አሁን የተጠቀሙበት የይለፍ ቃል በውሂብ ጥሰት ውስጥ ተገኝቷል። የእርስዎን መለያዎች ደህንነት ለመጠበቅ Google የይለፍ ቃል አስተዳዳሪ አሁኑኑ እንዲቀይሩት እና የተቀመጡ የይለፍ ቃላትዎን እንዲፈትሹ ይመክራል።</translation> <translation id="6000758707621254961">ለ«<ph name="SEARCH_TEXT" />» <ph name="RESULT_COUNT" /> ውጤቶችን አሳይ</translation> <translation id="6006484371116297560">የታወቀ ገጽታ</translation> <translation id="6008122969617370890">N-ለ1 ቅደም-ተከተል</translation> @@ -1857,6 +1861,7 @@ <translation id="6061154937977953833">ነጻ ትግል</translation> <translation id="6064217302520318294">ማያ ገጽ መቆለፊያ</translation> <translation id="6064602040258638498">ኩፖኖች እና የዋጋ ቅናሾች</translation> +<translation id="6078813287646374487">ስለዚህ ገጽ ተጨማሪ መረጃ አሳይ</translation> <translation id="6080696365213338172">በአስተዳዳሪ የቀረበ የእውቅና ማረጋገጫ በመጠቀም ይዘት ደርሰዋል። ለ<ph name="DOMAIN" /> የሚያቀርቡት ውሂብ በአስተዳዳሪዎ ሊያዝ ይችላል።</translation> <translation id="6087312102907839798">ተዛማጅ ፍለጋዎች</translation> <translation id="6094273045989040137">አብራራ</translation> @@ -2595,6 +2600,7 @@ <translation id="8163866351304776260">በግራ በኩል አራቴ ብሳ</translation> <translation id="8175796834047840627">እርስዎ በመለያ ስለገቡ Chrome ወደ የእርስዎ የGoogle መለያ ለማስቀመጥ አማራጭ እያቀረበ ነው። ይህን ባህሪ በቅንብሮች ውስጥ መለወጥ ይችላሉ።</translation> <translation id="8176440868214972690">የዚህ መሣሪያ አስተዳዳሪ እንደ ቅንብሮች ወይም መመሪያዎች ላሉት ለሚከተሉት ድር ጣቢያዎች የተወሰነ መረጃ ልኳል።</translation> +<translation id="8179003511148538426">ጉዞዎች በግማሽ ከፍታ ላይ ተከፍተዋል</translation> <translation id="8184538546369750125">ሁለንተናዊ ነባሪውን ተጠቀም (ፍቀድ)</translation> <translation id="8186706823560132848">ሶፍትዌር</translation> <translation id="8190193880870196235">በቅጥያ የሚተዳደር</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 46b3625..860e4baf9 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -1056,6 +1056,7 @@ <translation id="3810973564298564668">إدارة</translation> <translation id="3816482573645936981">القيمة (التي تم استبدالها)</translation> <translation id="382518646247711829">إذا كنت تستخدم خادمًا وكيلاً...</translation> +<translation id="3826050100957962900">تسجيل الدخول في الخدمات التابعة لجهات خارجية</translation> <translation id="3827112369919217609">صيغة مطلقة</translation> <translation id="3827666161959873541">أفلام عائلية</translation> <translation id="3828924085048779000">غير مسموح باستخدام عبارة مرور فارغة.</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 88bff712..0faee1fe 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -1052,6 +1052,7 @@ <translation id="3810973564298564668">পৰিচালনা কৰক</translation> <translation id="3816482573645936981">মান (অপসাৰণ কৰা হৈছে)</translation> <translation id="382518646247711829">যদি আপুনি কোনো প্ৰ’ক্সী ছাৰ্ভাৰ ব্যৱহাৰ কৰে...</translation> +<translation id="3826050100957962900">তৃতীয় পক্ষৰ ছাইন ইন</translation> <translation id="3827112369919217609">চূডা়ন্ত</translation> <translation id="3827666161959873541">পাৰিবাৰিক চলচ্চিত্ৰ</translation> <translation id="3828924085048779000">খালী পাছফ্ৰেজৰ অনুমতি নাই।</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 874b35a..7960ce4 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">İdarə edin</translation> <translation id="3816482573645936981">Dəyər (əvəz edilib)</translation> <translation id="382518646247711829">Əgər proksi server istifadə edirsinizsə...</translation> +<translation id="3826050100957962900">Üçüncü tərəfin girişi</translation> <translation id="3827112369919217609">Mütləq</translation> <translation id="3827666161959873541">Ailə filmləri</translation> <translation id="3828924085048779000">Boş parola icazə verilmir.</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index fbf9578..918e41de 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Кіраваць</translation> <translation id="3816482573645936981">Значэнне (замененае)</translation> <translation id="382518646247711829">Калі вы выкарыстоўваеце проксі-сервер...</translation> +<translation id="3826050100957962900">Уваход праз староннія сэрвісы</translation> <translation id="3827112369919217609">Абсалютны</translation> <translation id="3827666161959873541">Сямейныя фільмы</translation> <translation id="3828924085048779000">Неабходна задаць фразу-пароль</translation> @@ -1332,6 +1333,7 @@ <translation id="4607603470419975064">Кнопка "Паказаць парады адносна Chrome". Каб азнаёміцца з функцыямі браўзера Chrome, націсніце Enter</translation> <translation id="4607608436550361748">Паказаць парады адносна Chrome</translation> <translation id="4617273035598175554">Праграмнае забеспячэнне для графікі і анімацыі</translation> +<translation id="4627165777145349100">Падрабязней пра гэту старонку</translation> <translation id="4627675673814409125">Гэту палітыку нельга задаць на ўзроўні профілю Chrome, таму яна будзе ігнаравацца.</translation> <translation id="4628948037717959914">Фота</translation> <translation id="4631649115723685955">З вяртаннем грошай</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 91afc46..e9d17f8 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -1053,6 +1053,7 @@ <translation id="3810973564298564668">Управление</translation> <translation id="3816482573645936981">Стойност (заменена)</translation> <translation id="382518646247711829">Ако използвате прокси сървър...</translation> +<translation id="3826050100957962900">Подкани за вход от трети страни</translation> <translation id="3827112369919217609">Абсолютно</translation> <translation id="3827666161959873541">Семейни филми</translation> <translation id="3828924085048779000">Не може пропускът да не се попълни.</translation> @@ -1331,6 +1332,7 @@ <translation id="4607603470419975064">Бутон за преглед на съветите за Chrome. Натиснете Enter, за да научите повече за функциите на браузъра</translation> <translation id="4607608436550361748">Вижте съветите за Chrome</translation> <translation id="4617273035598175554">Софтуер за графика и анимация</translation> +<translation id="4627165777145349100">Още за тази страница</translation> <translation id="4627675673814409125">Това правило не може да се зададе на ниво потребителски профил в Chrome и ще бъде пренебрегнато.</translation> <translation id="4628948037717959914">Снимка</translation> <translation id="4631649115723685955">Опцията за връщане на пари при покупка е свързана</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 94656ac..8a6d7ff 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -1056,6 +1056,7 @@ <translation id="3810973564298564668">পরিচালনা করুন</translation> <translation id="3816482573645936981">মান (পুরনো মানের জায়গাতে নতুন মান প্রয়োগ করা হয়েছে)</translation> <translation id="382518646247711829">যদি আপনি একটি প্রক্সি সার্ভার ব্যবহার করেন...</translation> +<translation id="3826050100957962900">থার্ড-পার্টির সাইন-ইন</translation> <translation id="3827112369919217609">অ্যাবসোলিউট</translation> <translation id="3827666161959873541">পরিবারিক সিনেমা</translation> <translation id="3828924085048779000">ফাঁকা পাসফ্রেজের অনুমতি নেই৷</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 73866faf..392f686 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Upravljaj</translation> <translation id="3816482573645936981">Vrijednost (zamijenjeno)</translation> <translation id="382518646247711829">Ako koristite proksi server...</translation> +<translation id="3826050100957962900">Prijava treće strane</translation> <translation id="3827112369919217609">Apsolutno</translation> <translation id="3827666161959873541">Porodični filmovi</translation> <translation id="3828924085048779000">Polje za pristupni izraz ne može biti prazno.</translation> @@ -1829,7 +1830,7 @@ <translation id="5989320800837274978">Nije naveden fiksni proksi server niti URL pac skripte.</translation> <translation id="5992691462791905444">Inženjersko Z-presavijanje</translation> <translation id="5995727681868049093">Upravljajte podacima, privatnošću i sigurnošću na Google računu</translation> -<translation id="5997247540087773573">Zaporka koju ste upravo upotrijebili otkrivena je u povredi podataka. Radi zaštite vaših računa Google upravitelj zaporki preporučuje da je odmah promijenite i provjerite svoje spremljene zaporke.</translation> +<translation id="5997247540087773573">Lozinka koju ste upravo koristili pronađena je prilikom narušavanja podataka. Da osigura vaše račune, Googleov Upravitelj lozinki preporučuje da odmah promijenite lozinku i provjerite sačuvane lozinke.</translation> <translation id="6000758707621254961">Broj rezultata <ph name="RESULT_COUNT" /> za "<ph name="SEARCH_TEXT" />"</translation> <translation id="6006484371116297560">Klasično</translation> <translation id="6008122969617370890">Redoslijed od N do 1</translation> @@ -1868,7 +1869,7 @@ <translation id="6061154937977953833">Hrvanje</translation> <translation id="6064217302520318294">Zaključavanje ekrana</translation> <translation id="6064602040258638498">Kuponi i popusti</translation> -<translation id="6078813287646374487">Prikaži više informacija o ovoj stranici</translation> +<translation id="6078813287646374487">Prikažite više informacija o ovoj stranici</translation> <translation id="6080696365213338172">Pristupili ste sadržaju putem potvrde koju je pružio administrator. Administrator može presresti podatke koje pružite domeni <ph name="DOMAIN" />.</translation> <translation id="6087312102907839798">Srodna pretraživanja</translation> <translation id="6094273045989040137">Dodajte bilješku</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 486f5060..2253ef88 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">Gestiona</translation> <translation id="3816482573645936981">Valor (substituït)</translation> <translation id="382518646247711829">Si feu servir un servidor intermediari...</translation> +<translation id="3826050100957962900">Inici de sessió de tercers</translation> <translation id="3827112369919217609">Absolut</translation> <translation id="3827666161959873541">Pel·lícules familiars</translation> <translation id="3828924085048779000">Les frases de contrasenya no poder estar buides.</translation> @@ -1324,6 +1325,7 @@ <translation id="4607603470419975064">Botó Mostra consells per a Chrome: prem Retorn per obtenir informació sobre les funcions de Chrome</translation> <translation id="4607608436550361748">Mostra consells per a Chrome</translation> <translation id="4617273035598175554">Programari d'animació i gràfics</translation> +<translation id="4627165777145349100">Més informació sobre aquesta pàgina</translation> <translation id="4627675673814409125">Aquesta política no es pot establir a nivell del perfil de Chrome i s'ignorarà.</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4631649115723685955">Devolució de diners associada</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 2e3f191..824d8e1 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -1047,6 +1047,7 @@ <translation id="3810973564298564668">Spravovat</translation> <translation id="3816482573645936981">Hodnota (nahrazena)</translation> <translation id="382518646247711829">Pokud používáte proxy server...</translation> +<translation id="3826050100957962900">Externí přihlašování</translation> <translation id="3827112369919217609">Absolutní</translation> <translation id="3827666161959873541">Rodinné filmy</translation> <translation id="3828924085048779000">Prázdná heslová fráze není povolena.</translation> @@ -1056,6 +1057,7 @@ <translation id="3835233591525155343">Využití vašeho zařízení</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, stisknutím klávesy Tab a poté Enter rychle vytvoříte nový Dokument Google</translation> <translation id="385051799172605136">Zpět</translation> +<translation id="3851515670389017037">Cesty jsou zavřené</translation> <translation id="3858027520442213535">Aktualizovat datum a čas</translation> <translation id="3858860766373142691">Název</translation> <translation id="3872834068356954457">Věda</translation> @@ -1320,6 +1322,7 @@ <translation id="4607603470419975064">Tlačítko Zobrazit tipy k Chromu, stisknutím klávesy Enter zobrazíte další informace o funkcích Chromu</translation> <translation id="4607608436550361748">Zobrazit tipy k Chromu</translation> <translation id="4617273035598175554">Grafika a animační software</translation> +<translation id="4627165777145349100">Další informace o této stránce</translation> <translation id="4627675673814409125">Tuto zásadu nelze nastavit na úrovni profilu Chrome, bude proto ignorována.</translation> <translation id="4628948037717959914">Fotka</translation> <translation id="4631649115723685955">Cashback je propojen</translation> @@ -1350,6 +1353,7 @@ <translation id="470284880436071933">Zločin a spravedlnost</translation> <translation id="4704732901923281920">Biologické vědy</translation> <translation id="4708268264240856090">Připojení bylo přerušeno</translation> +<translation id="4709819737903924300">Cesty jsou otevřené na celou výšku</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Spustit Diagnostiku sítě systému Windows<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Heslo uživatele <ph name="USERNAME" /></translation> @@ -1813,6 +1817,7 @@ <translation id="5989320800837274978">Nejsou určeny pevně dané servery proxy ani adresa URL skriptu PAC.</translation> <translation id="5992691462791905444">Technické přeložení do Z</translation> <translation id="5995727681868049093">Správa údajů, ochrany soukromí a zabezpečení v účtu Google</translation> +<translation id="5997247540087773573">Právě použité heslo bylo nalezeno na seznamu hesel uniklých při incidentu porušení zabezpečení údajů. Kvůli zabezpečení vašich účtů Správce hesel Google doporučuje ihned toto heslo změnit a zkontrolovat uložená hesla.</translation> <translation id="6000758707621254961">Výsledky pro dotaz <ph name="SEARCH_TEXT" /> (<ph name="RESULT_COUNT" />)</translation> <translation id="6006484371116297560">Klasické</translation> <translation id="6008122969617370890">Pořadí N stránek na list</translation> @@ -1851,6 +1856,7 @@ <translation id="6061154937977953833">Wrestling</translation> <translation id="6064217302520318294">Zámek obrazovky</translation> <translation id="6064602040258638498">Kupony a slevové nabídky</translation> +<translation id="6078813287646374487">Zobrazit další informace o této stránce</translation> <translation id="6080696365213338172">Získali jste přístup k obsahu pomocí certifikátu poskytnutého správcem. Údaje poskytovaná doméně <ph name="DOMAIN" /> bude správce moci zachytit.</translation> <translation id="6087312102907839798">Související vyhledávání</translation> <translation id="6094273045989040137">Přidat značky a poznámky</translation> @@ -2587,6 +2593,7 @@ <translation id="8163866351304776260">Čtyři díry vlevo</translation> <translation id="8175796834047840627">Chrome vám nabízí uložení karet do účtu Google, protože jste přihlášeni. Toto chování můžete změnit v Nastavení.</translation> <translation id="8176440868214972690">Administrátor tohoto zařízení odeslal určité informace (například nastavení nebo zásady) následujícím webům.</translation> +<translation id="8179003511148538426">Cesty jsou otevřené na polovinu výšky</translation> <translation id="8184538546369750125">Použít výchozí globální hodnotu (Povolit)</translation> <translation id="8186706823560132848">Software</translation> <translation id="8190193880870196235">Spravováno rozšířením</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 4df2f1c7..220ec8ba 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Rheoli</translation> <translation id="3816482573645936981">Gwerth (wedi'i ddisodli)</translation> <translation id="382518646247711829">Os ydych yn defnyddio dirprwy weinydd...</translation> +<translation id="3826050100957962900">Mewngofnodi trydydd parti</translation> <translation id="3827112369919217609">Absoliwt</translation> <translation id="3827666161959873541">Ffilmiau i'r teulu</translation> <translation id="3828924085048779000">Ni chaniateir cyfrinymadrodd gwag.</translation> @@ -1333,6 +1334,7 @@ <translation id="4607603470419975064">Botwm gweld awgrymiadau Chrome, pwyswch Enter i ddysgu am nodweddion Chrome</translation> <translation id="4607608436550361748">Gweld awgrymiadau Chrome</translation> <translation id="4617273035598175554">Meddalwedd graffeg ac animeiddio</translation> +<translation id="4627165777145349100">Rhagor am y dudalen hon</translation> <translation id="4627675673814409125">Ni ellir gosod y polisi hwn ar lefel proffil Chrome a bydd yn cael ei anwybyddu.</translation> <translation id="4628948037717959914">Llun</translation> <translation id="4631649115723685955">Mae arian yn ôl wedi'i gysylltu</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 2e046af..14bc9170 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Administrer</translation> <translation id="3816482573645936981">Værdi (tilsidesat)</translation> <translation id="382518646247711829">Hvis du bruger en proxyserver...</translation> +<translation id="3826050100957962900">Third-party sign-in</translation> <translation id="3827112369919217609">Absolut</translation> <translation id="3827666161959873541">Familiefilm</translation> <translation id="3828924085048779000">Tomme adgangssætninger er ikke tilladt.</translation> @@ -1064,6 +1065,7 @@ <translation id="3835233591525155343">Din enhedsbrug</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, tryk på Tab-tasten efterfulgt af Enter for hurtigt at oprette et nyt Google-dokument</translation> <translation id="385051799172605136">Tilbage</translation> +<translation id="3851515670389017037">Rejser er lukket</translation> <translation id="3858027520442213535">Opdater dato og tid</translation> <translation id="3858860766373142691">Navn</translation> <translation id="3872834068356954457">Videnskab</translation> @@ -1364,6 +1366,7 @@ <translation id="470284880436071933">Kriminalitet og retshåndhævelse</translation> <translation id="4704732901923281920">Biologisk videnskab</translation> <translation id="4708268264240856090">Din forbindelse blev afbrudt</translation> +<translation id="4709819737903924300">Rejser er åbnet i fuld højde</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Køre Windows Netværksdiagnosticering<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Adgangskode til <ph name="USERNAME" /></translation> @@ -1827,6 +1830,7 @@ <translation id="5989320800837274978">Der er hverken angivet faste proxyservere eller en .pac-scriptwebadresse.</translation> <translation id="5992691462791905444">Z-fals med kant foroven</translation> <translation id="5995727681868049093">Administrer din konto, dit privatliv og beskyttelsen på din Google-konto</translation> +<translation id="5997247540087773573">Den adgangskode, du lige har brugt, er blevet lækket i forbindelse med et brud på datasikkerheden. For at beskytte dine konti anbefaler Google Adgangskodeadministrator, at du ændrer det nu og tjekker dine gemte adgangskoder.</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> resultater for "<ph name="SEARCH_TEXT" />"</translation> <translation id="6006484371116297560">Klassisk</translation> <translation id="6008122969617370890">N-til-1-rækkefølge</translation> @@ -1865,6 +1869,7 @@ <translation id="6061154937977953833">Brydning</translation> <translation id="6064217302520318294">Skærmlås</translation> <translation id="6064602040258638498">Rabatter og kupontilbud</translation> +<translation id="6078813287646374487">Vis flere oplysninger om denne side</translation> <translation id="6080696365213338172">Du har opnår adgang til indhold vha. et administratorcertifikat. De data, du angiver til <ph name="DOMAIN" />, kan indhentes af din administrator.</translation> <translation id="6087312102907839798">Relaterede søgninger</translation> <translation id="6094273045989040137">Annoter</translation> @@ -2603,6 +2608,7 @@ <translation id="8163866351304776260">Fire huller i venstre side</translation> <translation id="8175796834047840627">Chrome tilbyder at gemme dine kort på din Google-konto, fordi du er logget ind. Du kan ændre dette i indstillingerne.</translation> <translation id="8176440868214972690">Administratoren af denne enhed har sendt nogle oplysninger til følgende websites, f.eks. indstillinger eller politikker.</translation> +<translation id="8179003511148538426">Rejser er åbnet i halv højde</translation> <translation id="8184538546369750125">Brug global standard (tillad)</translation> <translation id="8186706823560132848">Software</translation> <translation id="8190193880870196235">Administreres af en udvidelse</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 87cdc35..eec1078 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -1049,6 +1049,7 @@ <translation id="3810973564298564668">Verwalten</translation> <translation id="3816482573645936981">Wert (ersetzt)</translation> <translation id="382518646247711829">Falls du einen Proxyserver verwendest...</translation> +<translation id="3826050100957962900">Drittanbieter-Anmeldung</translation> <translation id="3827112369919217609">Absolut</translation> <translation id="3827666161959873541">Filme für die ganze Familie</translation> <translation id="3828924085048779000">Eine leere Passphrase ist nicht zulässig.</translation> @@ -1322,6 +1323,7 @@ <translation id="4607603470419975064">Schaltfläche „Chrome-Tipps aufrufen“ – drücke die Eingabetaste, um mehr über die Funktionen von Chrome zu erfahren</translation> <translation id="4607608436550361748">Chrome-Tipps aufrufen</translation> <translation id="4617273035598175554">Grafik- und Animationssoftware</translation> +<translation id="4627165777145349100">Mehr über diese Seite</translation> <translation id="4627675673814409125">Diese Richtlinie kann nicht auf der Chrome-Profilebene festgelegt werden und wird ignoriert.</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4631649115723685955">Cashback zugeordnet</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 792efd3..ddd8cc7 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -1056,6 +1056,7 @@ <translation id="3810973564298564668">Διαχείριση</translation> <translation id="3816482573645936981">Τιμή (αντικαταστάθηκε)</translation> <translation id="382518646247711829">Εάν χρησιμοποιείτε διακομιστή μεσολάβησης…</translation> +<translation id="3826050100957962900">Σύνδεση τρίτων μερών</translation> <translation id="3827112369919217609">Απόλυτη</translation> <translation id="3827666161959873541">Οικογενειακές ταινίες</translation> <translation id="3828924085048779000">Δεν επιτρέπεται να είναι κενή η φράση πρόσβασης.</translation> @@ -1065,6 +1066,7 @@ <translation id="3835233591525155343">Χρήση της συσκευής σας</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, πατήστε το πλήκτρο Tab και έπειτα το πλήκτρο Enter για να δημιουργήσετε γρήγορα ένα νέο Έγγραφο Google</translation> <translation id="385051799172605136">Πίσω</translation> +<translation id="3851515670389017037">Οι διαδρομές έκλεισαν</translation> <translation id="3858027520442213535">Ενημέρωση ημερομηνίας και ώρας</translation> <translation id="3858860766373142691">Όνομα</translation> <translation id="3872834068356954457">Επιστήμες</translation> @@ -1366,6 +1368,7 @@ <translation id="470284880436071933">Έγκλημα και δικαιοσύνη</translation> <translation id="4704732901923281920">Βιοϊατρικές επιστήμες</translation> <translation id="4708268264240856090">Η σύνδεσή σας διακόπηκε</translation> +<translation id="4709819737903924300">Οι διαδρομές άνοιξαν σε πλήρες ύψος</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Να εκτελέσετε τον Διαγνωστικό έλεγχο δικτύου των Windows<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Κωδικός πρόσβασης για <ph name="USERNAME" /></translation> @@ -1831,6 +1834,7 @@ <translation id="5989320800837274978">Δεν προσδιορίζονται ούτε οι σταθεροί διακομιστές μεσολάβησης ούτε μια διεύθυνση URL σεναρίου .pac.</translation> <translation id="5992691462791905444">Δίπλωση Ζ τεχνικών εγγράφων</translation> <translation id="5995727681868049093">Διαχειριστείτε τις πληροφορίες, το απόρρητο και την ασφάλεια στον Λογαριασμό σας Google</translation> +<translation id="5997247540087773573">Ο κωδικός πρόσβασης που μόλις χρησιμοποιήσατε εντοπίστηκε σε μια παραβίαση δεδομένων. Για την ασφάλεια των λογαριασμών σας, ο Διαχειριστής κωδικών πρόσβασης Google συνιστά να αλλάξετε άμεσα τον κωδικό πρόσβασης και να ελέγξετε τους αποθηκευμένους κωδικούς πρόσβασης.</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> αποτελέσματα για την αναζήτηση "<ph name="SEARCH_TEXT" />"</translation> <translation id="6006484371116297560">Κλασικό</translation> <translation id="6008122969617370890">Σειρά N προς 1</translation> @@ -1869,6 +1873,7 @@ <translation id="6061154937977953833">Πάλη</translation> <translation id="6064217302520318294">Κλείδωμα οθόνης</translation> <translation id="6064602040258638498">Κουπόνια και εκπτωτικές προσφορές</translation> +<translation id="6078813287646374487">Εμφάνιση περισσότερων πληροφοριών σχετικά με αυτήν τη σελίδα</translation> <translation id="6080696365213338172">Η πρόσβασή σας στο περιεχόμενο πραγματοποιήθηκε με τη χρήση ενός πιστοποιητικού που παρασχέθηκε από διαχειριστή. Τα δεδομένα που παρέχετε στο <ph name="DOMAIN" /> μπορεί να ελέγχονται από το διαχειριστή σας.</translation> <translation id="6087312102907839798">Συναφείς αναζητήσεις</translation> <translation id="6094273045989040137">Σχολιασμός</translation> @@ -2607,6 +2612,7 @@ <translation id="8163866351304776260">Τετραπλό τρύπημα στα αριστερά</translation> <translation id="8175796834047840627">Το Chrome προσφέρεται να αποθηκεύσει τις κάρτες σας στον Λογαριασμό σας Google επειδή έχετε συνδεθεί. Μπορείτε να αλλάξετε αυτήν τη συμπεριφορά στις ρυθμίσεις.</translation> <translation id="8176440868214972690">Ο διαχειριστής αυτής της συσκευής έστειλε ορισμένες πληροφορίες στους παρακάτω ιστοτόπους, όπως ρυθμίσεις ή πολιτικές.</translation> +<translation id="8179003511148538426">Οι διαδρομές άνοιξαν στο μισό ύψος</translation> <translation id="8184538546369750125">Χρήση καθολικής προεπιλεγμένης ρύθμισης (Επιτρέπεται)</translation> <translation id="8186706823560132848">Λογισμικό</translation> <translation id="8190193880870196235">Υπό τη διαχείριση μιας επέκτασης</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 46cf031..95f5ffa 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Manage</translation> <translation id="3816482573645936981">Value (superseded)</translation> <translation id="382518646247711829">If you use a proxy server...</translation> +<translation id="3826050100957962900">Third-party sign-in</translation> <translation id="3827112369919217609">Absolute</translation> <translation id="3827666161959873541">Family movies</translation> <translation id="3828924085048779000">Empty passphrase is not allowed.</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 4fb9a9ee..1a1ef595 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1052,6 +1052,7 @@ <translation id="3810973564298564668">Administrar</translation> <translation id="3816482573645936981">Valor (sustituido)</translation> <translation id="382518646247711829">Si utilizas un servidor proxy...</translation> +<translation id="3826050100957962900">Acceso de terceros</translation> <translation id="3827112369919217609">Absoluto</translation> <translation id="3827666161959873541">Películas familiares</translation> <translation id="3828924085048779000">No se permite una frase de contraseña vacía.</translation> @@ -1325,6 +1326,7 @@ <translation id="4607603470419975064">Botón para ver sugerencias de Chrome, presiona Intro para conocer las funciones de Chrome</translation> <translation id="4607608436550361748">Ver sugerencias para Chrome</translation> <translation id="4617273035598175554">Software de gráficos y animación</translation> +<translation id="4627165777145349100">Más información sobre esta página</translation> <translation id="4627675673814409125">Se ignorará esta política porque no se puede establecer en el perfil de Chrome.</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4631649115723685955">Devolución de dinero vinculada</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 8603e08c..ac4b7ec 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Gestionar</translation> <translation id="3816482573645936981">Valor (sustituido)</translation> <translation id="382518646247711829">Si utilizas un servidor proxy...</translation> +<translation id="3826050100957962900">Inicio de sesión de terceros</translation> <translation id="3827112369919217609">Absoluto</translation> <translation id="3827666161959873541">Películas familiares</translation> <translation id="3828924085048779000">La frase de contraseña no puede estar vacía.</translation> @@ -1333,6 +1334,7 @@ <translation id="4607603470419975064">Botón de ver consejos de Chrome, pulsa Intro para ver información sobre las funciones de Chrome</translation> <translation id="4607608436550361748">Ver consejos de Chrome</translation> <translation id="4617273035598175554">Software de animación y gráficos</translation> +<translation id="4627165777145349100">Más sobre esta página</translation> <translation id="4627675673814409125">Esta política no se puede establecer a nivel de perfil de Chrome, por lo que no tendrá ningún efecto.</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4631649115723685955">Devolución de dinero asociada</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index fa74d1c..0746429 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Halda</translation> <translation id="3816482573645936981">Väärtus (asendatud)</translation> <translation id="382518646247711829">Kui kasutate puhverserverit ...</translation> +<translation id="3826050100957962900">Kolmanda osapoole sisselogimisviibad</translation> <translation id="3827112369919217609">Absoluutne</translation> <translation id="3827666161959873541">Koguperefilmid</translation> <translation id="3828924085048779000">Tühi parool ei ole lubatud.</translation> @@ -1063,6 +1064,7 @@ <translation id="3835233591525155343">Teie seadmekasutus</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, kiirelt uue Google'i dokumendi loomiseks vajutage tabulaatorit ja seejärel sisestusklahvi</translation> <translation id="385051799172605136">Tagasi</translation> +<translation id="3851515670389017037">Teekonnad on suletud</translation> <translation id="3858027520442213535">Värskenda kuupäeva ja kellaaega</translation> <translation id="3858860766373142691">Nimi</translation> <translation id="3872834068356954457">Teadus</translation> @@ -1332,6 +1334,7 @@ <translation id="4607603470419975064">Nupp Kuva Chrome'i nõuanded, Chrome'i funktsioonide kohta lisateabe saamiseks vajutage sisestusklahvi</translation> <translation id="4607608436550361748">Vaadake Chrome'i nõuandeid</translation> <translation id="4617273035598175554">Jooniste ja animatsiooni tarkvara</translation> +<translation id="4627165777145349100">Lisateave selle lehe kohta</translation> <translation id="4627675673814409125">Seda reeglit ei saa Chrome'i profiili tasemel määrata ja seda eiratakse.</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4631649115723685955">Ostuboonus on lingitud</translation> @@ -1362,6 +1365,7 @@ <translation id="470284880436071933">Kuritegevus ja õigusemõistmine</translation> <translation id="4704732901923281920">Bioloogiateadused</translation> <translation id="4708268264240856090">Teie ühendus katkes</translation> +<translation id="4709819737903924300">Teekonnad on avatud täiskõrgusel</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windowsi võrgudiagnostika käitamine<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Kasutaja <ph name="USERNAME" /> parool</translation> @@ -1825,6 +1829,7 @@ <translation id="5989320800837274978">Määratud ei ole fikseeritud puhverservereid ega pac-skriptiga URL-i.</translation> <translation id="5992691462791905444">Z-kujuliselt volditud</translation> <translation id="5995727681868049093">Google'i kontol teabe, privaatsuse ja turvalisuse haldamine</translation> +<translation id="5997247540087773573">Äsja kasutatud parool leiti andmetega seotud rikkumisest. Teie kontode turvalisuse kaitsmiseks soovitab Google'i paroolihaldur teil seda parooli kohe muuta ja kontrollida oma salvestatud paroole.</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> tulemust otsingule „<ph name="SEARCH_TEXT" />”</translation> <translation id="6006484371116297560">Klassikaline</translation> <translation id="6008122969617370890">Järjestus n–1</translation> @@ -1863,6 +1868,7 @@ <translation id="6061154937977953833">Maadlus</translation> <translation id="6064217302520318294">Ekraanilukk</translation> <translation id="6064602040258638498">Kupongid ja sooduspakkumised</translation> +<translation id="6078813287646374487">Kuva selle lehe kohta lisateavet</translation> <translation id="6080696365213338172">Olete sisule juurde pääsenud administraatori antud sertifikaadiga. Administraator saab domeenile <ph name="DOMAIN" /> edastatavaid andmeid kinni pidada.</translation> <translation id="6087312102907839798">Seotud otsingud</translation> <translation id="6094273045989040137">Lisa märkus</translation> @@ -2601,6 +2607,7 @@ <translation id="8163866351304776260">Neli auku vasakul</translation> <translation id="8175796834047840627">Chrome pakub võimalust salvestada kaardid teie Google'i kontole, kuna olete sisse logitud. Seda käitumist saab seadetes muuta.</translation> <translation id="8176440868214972690">Seadme administraator on järgmistele veebisaitidele teatud teavet saatnud, näiteks seadete ja eeskirjade teavet.</translation> +<translation id="8179003511148538426">Teekonnad on avatud poolel kõrgusel</translation> <translation id="8184538546369750125">Kasuta globaalset vaikeseadet (luba)</translation> <translation id="8186706823560132848">Tarkvara</translation> <translation id="8190193880870196235">Haldab laiendus</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index c60c4906..4d77140 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -1047,6 +1047,7 @@ <translation id="3810973564298564668">Kudeatu</translation> <translation id="3816482573645936981">Balioa (ordeztua)</translation> <translation id="382518646247711829">Proxy-zerbitzari bat erabiltzen baduzu…</translation> +<translation id="3826050100957962900">Hirugarrenen bidez saioa hastea</translation> <translation id="3827112369919217609">Absolutua</translation> <translation id="3827666161959873541">Familientzako filmak</translation> <translation id="3828924085048779000">Pasaesaldia ezin da hutsik utzi.</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index a6caa511..e557392 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">مدیریت</translation> <translation id="3816482573645936981">مقدار (جایگزینشده)</translation> <translation id="382518646247711829">اگر از سرور پراکسی استفاده میکنید...</translation> +<translation id="3826050100957962900">ورود به سیستم شخص ثالث</translation> <translation id="3827112369919217609">دقیق</translation> <translation id="3827666161959873541">فیلم خانوادگی</translation> <translation id="3828924085048779000">گذرعبارت خالی مجاز نیست.</translation> @@ -1064,6 +1065,7 @@ <translation id="3835233591525155343">استفاده از دستگاه</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />؛ برای ایجاد سریع «سندنگار Google» جدید، کلید «جهش» و سپس «ورود» را فشار دهید</translation> <translation id="385051799172605136">بازگشت</translation> +<translation id="3851515670389017037">«سفرهای جستجو» بسته شد</translation> <translation id="3858027520442213535">بهروزرسانی تاریخ و زمان</translation> <translation id="3858860766373142691">نام</translation> <translation id="3872834068356954457">علم</translation> @@ -1364,6 +1366,7 @@ <translation id="470284880436071933">جنایت و عدالت</translation> <translation id="4704732901923281920">علوم زیستی</translation> <translation id="4708268264240856090">اتصال شما قطع شد</translation> +<translation id="4709819737903924300">«سفرهای جستجو» بهصورت کامل باز شد</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />اجرای Windows Network Diagnostics<ph name="END_LINK" /></translation> <translation id="4722735765955348426">گذرواژه <ph name="USERNAME" /></translation> @@ -1827,6 +1830,7 @@ <translation id="5989320800837274978">سرور پروکسی ثابت و URL اسکریپت pac. تعیین نشدهاند.</translation> <translation id="5992691462791905444">تاخوردگی Z شکل مهندسی</translation> <translation id="5995727681868049093">مدیریت اطلاعات، حریمخصوصی، و امنیت در «حساب Google»</translation> +<translation id="5997247540087773573">گذرواژهای که اکنون استفاده کردید در سرقت اطلاعات شبکه پیدا شده است. برای حفظ امنیت حسابهایتان، «مدیر گذرواژه Google» توصیه میکند گذرواژهتان را همینحالا تغییر دهید و گذرواژههای ذخیرهشدهتان را بررسی کنید.</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> نتیجه برای «<ph name="SEARCH_TEXT" />»</translation> <translation id="6006484371116297560">کلاسيک</translation> <translation id="6008122969617370890">ترتیب N تا ۱</translation> @@ -1865,6 +1869,7 @@ <translation id="6061154937977953833">كُشتی</translation> <translation id="6064217302520318294">قفل صفحه</translation> <translation id="6064602040258638498">پیشنهادهای کوپن و تخفیف</translation> +<translation id="6078813287646374487">نمایش اطلاعات بیشتر درباره این صفحه</translation> <translation id="6080696365213338172">شما با استفاده از گواهی ارائه شده توسط سرپرست سیستم به محتوا دسترسی پیدا کردهاید. دادههایی که به <ph name="DOMAIN" /> ارائه میکنید ممکن است توسط سرپرست سیستم رهگیری شوند.</translation> <translation id="6087312102907839798">جستجوهای مربوط</translation> <translation id="6094273045989040137">حاشیهنویسی</translation> @@ -2603,6 +2608,7 @@ <translation id="8163866351304776260">چهار سوراخ در چپ</translation> <translation id="8175796834047840627">چون به سیستم وارد شدهاید، Chrome پیشنهاد میکند کارتها را در حساب Google ذخیره کنید. در تنظیمات میتوانید این رفتار را تغییر دهید.</translation> <translation id="8176440868214972690">سرپرست این دستگاه اطلاعاتی (مثل تنظیمات یا خطمشیها) را به وبسایتهای زیر ارسال کرده است.</translation> +<translation id="8179003511148538426">«سفرهای جستجو» تا نیمه باز شد</translation> <translation id="8184538546369750125">استفاده از پیشفرض جهانی (مجاز)</translation> <translation id="8186706823560132848">نرمافزار</translation> <translation id="8190193880870196235">تحتمدیریت افزونه</translation> @@ -2889,7 +2895,7 @@ <translation id="9036306139374661733">میکروفون مجاز شود؟</translation> <translation id="9038649477754266430">استفاده از یک سرویس پیشبینی برای بار کردن سریعتر صفحهها</translation> <translation id="9039213469156557790">علاوه بر این، این صفحه دارای منابع دیگری است که امن نیستند. دیگران میتوانند در حین انتقال، این منابع را ببینند و این منابع میتوانند برای تغییر رفتار صفحه، توسط یک مهاجم تغییر داده شوند.</translation> -<translation id="9040464167025094690">دکمه «دستگاهم را پیدا کن»؛ برای پیدا کردن دستگاهتان در «حساب Google»، کلید «ورود» را فشار دهید</translation> +<translation id="9040464167025094690">دکمه «یافتن دستگاهم»؛ برای پیدا کردن دستگاهتان در «حساب Google»، کلید «ورود» را فشار دهید</translation> <translation id="9042617223719777575">ظرفیت بالا</translation> <translation id="9044359186343685026">استفاده از شناسه لمسی</translation> <translation id="9045525010788763347"><ph name="RESULT_MODIFIED_DATE" /> - <ph name="RESULT_PRODUCT_SOURCE" /></translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 3e63c1b..02d02b65 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -1056,6 +1056,7 @@ <translation id="3810973564298564668">Hallinnoi</translation> <translation id="3816482573645936981">Arvo (korvattu)</translation> <translation id="382518646247711829">Jos käytät välityspalvelinta…</translation> +<translation id="3826050100957962900">Kolmannen osapuolen sisäänkirjautuminen</translation> <translation id="3827112369919217609">Absoluuttinen</translation> <translation id="3827666161959873541">Koko perheen elokuvat</translation> <translation id="3828924085048779000">Tunnuslause ei voi olla tyhjä.</translation> @@ -1065,6 +1066,7 @@ <translation id="3835233591525155343">Laitteesi käyttö</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, luo uusi Google-dokumentti nopeasti painamalla sarkainta ja sitten Enter</translation> <translation id="385051799172605136">Takaisin</translation> +<translation id="3851515670389017037">Selailu suljettu</translation> <translation id="3858027520442213535">Päivitä päivämäärä ja aika</translation> <translation id="3858860766373142691">Nimi</translation> <translation id="3872834068356954457">Tiede</translation> @@ -1365,6 +1367,7 @@ <translation id="470284880436071933">Rikollisuus ja oikeusjärjestelmä</translation> <translation id="4704732901923281920">Biologiset tieteet</translation> <translation id="4708268264240856090">Yhteys keskeytyi</translation> +<translation id="4709819737903924300">Selailu avattu koko näytön korkuisena</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windowsin verkon diagnostiikkaa<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Salasana: <ph name="USERNAME" /></translation> @@ -1828,6 +1831,7 @@ <translation id="5989320800837274978">Kiinteitä välityspalvelimia tai .pac-URL-osoitetta ei ole määritetty.</translation> <translation id="5992691462791905444">Kolmoistaite (engineering)</translation> <translation id="5995727681868049093">Ylläpidä tietojasi, yksityisyyttäsi ja tietoturvaasi Google-tilillä</translation> +<translation id="5997247540087773573">Juuri käyttämäsi salasana löytyi tietosuojaloukkauksesta. Tiliesi suojaamiseksi Googlen Salasanojen ylläpito suosittelee, että vaihdat salasanan heti ja tarkistat tallennetut salasanasi.</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> tulosta: <ph name="SEARCH_TEXT" /></translation> <translation id="6006484371116297560">Perinteinen</translation> <translation id="6008122969617370890">N-to-1-järjestys</translation> @@ -1866,6 +1870,7 @@ <translation id="6061154937977953833">Paini</translation> <translation id="6064217302520318294">Näytön lukitus</translation> <translation id="6064602040258638498">Kupongit ja alennukset</translation> +<translation id="6078813287646374487">Näytä lisätietoa tästä sivusta</translation> <translation id="6080696365213338172">Käytät sisältöä järjestelmänvalvojan myöntämällä varmenteella. Järjestelmänvalvoja voi käyttää verkkotunnukselle <ph name="DOMAIN" /> lähettämiäsi tietoja.</translation> <translation id="6087312102907839798">Samankaltaiset haut</translation> <translation id="6094273045989040137">Tee merkintä</translation> @@ -2604,6 +2609,7 @@ <translation id="8163866351304776260">Neljä reikää vasemmalla</translation> <translation id="8175796834047840627">Chrome tarjoaa korttien tallentamista Google-tilillesi, koska olet kirjautuneena sisään. Voit muuttaa tätä koska tahansa asetuksista.</translation> <translation id="8176440868214972690">Laitteen järjestelmänvalvoja on lähettänyt seuraaville verkkosivustoille joitakin tietoja, esim. asetuksia tai käytäntöjä.</translation> +<translation id="8179003511148538426">Selailu avattu puolen sivun korkuisena</translation> <translation id="8184538546369750125">Käytä yleistä oletusasetusta (salli)</translation> <translation id="8186706823560132848">Ohjelmisto</translation> <translation id="8190193880870196235">Laajennuksen hallinnoima</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 474b865..7a50de3d 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Pamahalaan</translation> <translation id="3816482573645936981">Value (nasasapawan)</translation> <translation id="382518646247711829">Kung gumagamit ka ng proxy server...</translation> +<translation id="3826050100957962900">Third-party na pag-sign in</translation> <translation id="3827112369919217609">Absolute</translation> <translation id="3827666161959873541">Mga pelikulang pampamilya</translation> <translation id="3828924085048779000">Hindi pinapayagan ang walang laman na passphrase.</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 557907f..77d88fc 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">Gérer</translation> <translation id="3816482573645936981">Valeur (remplacée)</translation> <translation id="382518646247711829">Si vous utilisez un serveur mandataire...</translation> +<translation id="3826050100957962900">Connexion tierce</translation> <translation id="3827112369919217609">Absolu</translation> <translation id="3827666161959873541">Films familiaux</translation> <translation id="3828924085048779000">La phrase de passe est obligatoire.</translation> @@ -1324,6 +1325,7 @@ <translation id="4607603470419975064">Bouton Afficher les astuces de Chrome, appuyez sur Entrée pour en savoir plus sur les fonctionnalités de Chrome</translation> <translation id="4607608436550361748">Afficher les astuces de Chrome</translation> <translation id="4617273035598175554">Logiciels de graphisme et d'animation</translation> +<translation id="4627165777145349100">En savoir plus sur cette page</translation> <translation id="4627675673814409125">Cette politique ne peut pas être réglée au niveau du profil Chrome et elle sera ignorée.</translation> <translation id="4628948037717959914">Photo</translation> <translation id="4631649115723685955">Avec remise en argent</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index fc668a0..1de7060 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Gérer</translation> <translation id="3816482573645936981">Valeur (remplacée)</translation> <translation id="382518646247711829">Si vous utilisez un serveur proxy…</translation> +<translation id="3826050100957962900">Connexion tierce</translation> <translation id="3827112369919217609">Valeur absolue</translation> <translation id="3827666161959873541">Films tous publics</translation> <translation id="3828924085048779000">La phrase secrète est obligatoire.</translation> @@ -1064,6 +1065,7 @@ <translation id="3835233591525155343">Savoir si vous utilisez l'appareil</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, appuyez sur Tabulation, puis sur Entrée pour créer rapidement un document Google Docs</translation> <translation id="385051799172605136">Retour</translation> +<translation id="3851515670389017037">Parcours fermés</translation> <translation id="3858027520442213535">Mettre à jour la date et l'heure</translation> <translation id="3858860766373142691">Nom</translation> <translation id="3872834068356954457">Sciences</translation> @@ -1333,6 +1335,7 @@ <translation id="4607603470419975064">Bouton "Voir les astuces Chrome", appuyez sur Entrée pour en savoir plus sur les fonctionnalités de Chrome</translation> <translation id="4607608436550361748">Voir les astuces Chrome</translation> <translation id="4617273035598175554">Logiciels de graphisme et d'animation</translation> +<translation id="4627165777145349100">En savoir plus sur cette page</translation> <translation id="4627675673814409125">Cette règle sera ignorée, car elle ne peut pas être définie au niveau du profil Chrome.</translation> <translation id="4628948037717959914">Photo</translation> <translation id="4631649115723685955">Avec cashback</translation> @@ -1363,6 +1366,7 @@ <translation id="470284880436071933">Justice et criminalité</translation> <translation id="4704732901923281920">Biologie</translation> <translation id="4708268264240856090">Votre connexion a été interrompue</translation> +<translation id="4709819737903924300">Parcours ouverts à pleine hauteur</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Exécutez les diagnostics réseau de Windows<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Mot de passe associé à <ph name="USERNAME" /></translation> @@ -1826,6 +1830,7 @@ <translation id="5989320800837274978">Aucun serveur proxy déterminé ou URL de script .pac n'a été indiqué.</translation> <translation id="5992691462791905444">Technique de pli en Z</translation> <translation id="5995727681868049093">Gérer vos infos, votre vie privée et votre sécurité dans votre compte Google</translation> +<translation id="5997247540087773573">Le mot de passe que vous venez d'utiliser a été détecté lors d'une violation de données. Pour sécuriser vos comptes, le Gestionnaire de mots de passe de Google vous recommande de le modifier immédiatement et de vérifier vos mots de passe enregistrés.</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> résultats pour "<ph name="SEARCH_TEXT" />"</translation> <translation id="6006484371116297560">Classique</translation> <translation id="6008122969617370890">Ordre N à 1</translation> @@ -1864,6 +1869,7 @@ <translation id="6061154937977953833">Lutte</translation> <translation id="6064217302520318294">Verrouillage de l'écran</translation> <translation id="6064602040258638498">Réductions et remises</translation> +<translation id="6078813287646374487">Afficher plus d'informations concernant cette page</translation> <translation id="6080696365213338172">Vous avez accédé à du contenu à l'aide d'un certificat fourni par l'administrateur. Les données que vous fournissez à <ph name="DOMAIN" /> peuvent être interceptées par votre administrateur.</translation> <translation id="6087312102907839798">Recherches associées</translation> <translation id="6094273045989040137">Annoter</translation> @@ -2603,6 +2609,7 @@ <translation id="8163866351304776260">Quadruple perforation à gauche</translation> <translation id="8175796834047840627">Chrome propose d'enregistrer vos cartes dans votre compte Google, car vous êtes connecté. Vous pouvez modifier ce comportement dans les paramètres.</translation> <translation id="8176440868214972690">L'administrateur de cet appareil a envoyé des infos, comme des paramètres ou des règles, aux sites Web suivants.</translation> +<translation id="8179003511148538426">Parcours ouverts à mi-hauteur</translation> <translation id="8184538546369750125">Utiliser le paramètre global par défaut ("Autoriser")</translation> <translation id="8186706823560132848">Logiciel</translation> <translation id="8190193880870196235">Gérée par une extension</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 8156d0b..b05c670c 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Xestionar</translation> <translation id="3816482573645936981">Valor (substituído)</translation> <translation id="382518646247711829">Se utilizas un servidor proxy...</translation> +<translation id="3826050100957962900">Inicio de sesión de terceiros</translation> <translation id="3827112369919217609">Absoluto</translation> <translation id="3827666161959873541">Películas para toda a familia</translation> <translation id="3828924085048779000">A frase de acceso non pode estar baleira.</translation> @@ -1332,6 +1333,7 @@ <translation id="4607603470419975064">Botón Ver consellos de Chrome. Preme Introducir para obter máis información sobre as funcións de Chrome</translation> <translation id="4607608436550361748">Ver consellos de Chrome</translation> <translation id="4617273035598175554">Software de animación e gráficos</translation> +<translation id="4627165777145349100">Máis información sobre esta páxina</translation> <translation id="4627675673814409125">Esta política non se pode configurar no perfil de Chrome e, polo tanto, ignorarase.</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4631649115723685955">Devolución de cartos vinculada</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index a7102a2..16e0839 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">મેનેજ કરો</translation> <translation id="3816482573645936981">મૂલ્ય (જગ્યા અન્ય દ્વારા લેવામાં આવી છે)</translation> <translation id="382518646247711829">જો તમે કોઈ પ્રૉક્સી સર્વરનો ઉપયોગ કરો છો...</translation> +<translation id="3826050100957962900">Third-party sign-in</translation> <translation id="3827112369919217609">ચોક્કસ</translation> <translation id="3827666161959873541">પારિવારિક મૂવી</translation> <translation id="3828924085048779000">ખાલી પાસફ્રેઝને અનુમતિ નથી. </translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index d97fcb04..1174c007 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">प्रबंधित करें</translation> <translation id="3816482573645936981">मान (इस मान की जगह लागू किया गया)</translation> <translation id="382518646247711829">अगर आप प्रॉक्सी सर्वर का उपयोग करते हैं...</translation> +<translation id="3826050100957962900">तीसरे पक्ष की सेवा के लिए, साइन इन करना</translation> <translation id="3827112369919217609">पूरा</translation> <translation id="3827666161959873541">पारिवारिक फ़िल्में</translation> <translation id="3828924085048779000">खाली 'पासफ़्रेज़' की अनुमति नहीं है.</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index bce31ec..f9738a3 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Upravljanje</translation> <translation id="3816482573645936981">Vrijednost (naslijeđena)</translation> <translation id="382518646247711829">Ako upotrebljavate proxy poslužitelj...</translation> +<translation id="3826050100957962900">Prijava za treće strane</translation> <translation id="3827112369919217609">Apsolutno</translation> <translation id="3827666161959873541">Obiteljski filmovi</translation> <translation id="3828924085048779000">Prazne zaporke nisu dopuštene.</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index ae8e838..4a78a01 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -1053,6 +1053,7 @@ <translation id="3810973564298564668">Kezelés</translation> <translation id="3816482573645936981">Érték (felülírva)</translation> <translation id="382518646247711829">Ha proxyszervert használ...</translation> +<translation id="3826050100957962900">Harmadik fél bejelentkezése</translation> <translation id="3827112369919217609">Abszolút</translation> <translation id="3827666161959873541">Családi filmek</translation> <translation id="3828924085048779000">Az üres összetett jelszó nem engedélyezett.</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index b797315..fc1f0f78 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Կառավարել</translation> <translation id="3816482573645936981">Արժեքը (փոխարինված է)</translation> <translation id="382518646247711829">Եթե օգտագործում եք պրոքսի սերվեր…</translation> +<translation id="3826050100957962900">Մուտք երրորդ կողմի ծառայությունների միջոցով</translation> <translation id="3827112369919217609">Բացարձակ</translation> <translation id="3827666161959873541">Ընտանեկան ֆիլմեր</translation> <translation id="3828924085048779000">Անցաբառի դաշտը չի կարող դատարկ լինել:</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 1f9c3c5..3c092962 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -1050,6 +1050,7 @@ <translation id="3810973564298564668">Kelola</translation> <translation id="3816482573645936981">Nilai (digantikan)</translation> <translation id="382518646247711829">Jika Anda menggunakan server proxy...</translation> +<translation id="3826050100957962900">Login pihak ketiga</translation> <translation id="3827112369919217609">Absolut</translation> <translation id="3827666161959873541">Film keluarga</translation> <translation id="3828924085048779000">Frasa sandi kosong tidak dibolehkan.</translation> @@ -1059,6 +1060,7 @@ <translation id="3835233591525155343">Penggunaan perangkat Anda</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, tekan Tab lalu Enter untuk membuat Dokumen Google baru dengan cepat</translation> <translation id="385051799172605136">Kembali</translation> +<translation id="3851515670389017037">Sheet Perjalanan ditutup</translation> <translation id="3858027520442213535">Perbarui tanggal dan waktu</translation> <translation id="3858860766373142691">Nama</translation> <translation id="3872834068356954457">Sains</translation> @@ -1354,6 +1356,7 @@ <translation id="470284880436071933">Kejahatan & keadilan</translation> <translation id="4704732901923281920">Ilmu biologi</translation> <translation id="4708268264240856090">Koneksi Anda terganggu</translation> +<translation id="4709819737903924300">Sheet Perjalanan terbuka penuh</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Jalankan Diagnostik Jaringan Windows<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Sandi untuk <ph name="USERNAME" /></translation> @@ -1817,6 +1820,7 @@ <translation id="5989320800837274978">Baik proxy server tetap ataupun URL skrip .pac tidak ditentukan.</translation> <translation id="5992691462791905444">Lipatan format engineering Z</translation> <translation id="5995727681868049093">Kelola info, privasi, dan keamanan di Akun Google Anda</translation> +<translation id="5997247540087773573">Sandi yang baru saja Anda gunakan terekspos dalam pelanggaran data. Untuk mengamankan akun Anda, Pengelola Sandi Google merekomendasikan untuk mengubah sandi tersebut sekarang dan memeriksa sandi tersimpan Anda.</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> hasil untuk '<ph name="SEARCH_TEXT" />'</translation> <translation id="6006484371116297560">Klasik</translation> <translation id="6008122969617370890">Urutan N-ke-1</translation> @@ -1855,6 +1859,7 @@ <translation id="6061154937977953833">Gulat</translation> <translation id="6064217302520318294">Kunci layar</translation> <translation id="6064602040258638498">Penawaran kupon & diskon</translation> +<translation id="6078813287646374487">Tampilkan informasi halaman ini selengkapnya</translation> <translation id="6080696365213338172">Anda telah mengakses konten menggunakan sertifikat yang diberikan oleh administrator. Data yang diberikan ke <ph name="DOMAIN" /> dapat dicegat oleh administrator Anda.</translation> <translation id="6087312102907839798">Penelusuran terkait</translation> <translation id="6094273045989040137">Anotasi</translation> @@ -2591,6 +2596,7 @@ <translation id="8163866351304776260">Empat lubang di kiri</translation> <translation id="8175796834047840627">Chrome menawarkan untuk menyimpan informasi kartu ke Akun Google Anda karena Anda sedang login. Anda dapat mengubah perilaku ini di setelan.</translation> <translation id="8176440868214972690">Administrator perangkat ini telah mengirim beberapa info ke situs berikut, seperti setelan atau kebijakan.</translation> +<translation id="8179003511148538426">Sheet Perjalanan terbuka setengah</translation> <translation id="8184538546369750125">Gunakan default global (Izinkan)</translation> <translation id="8186706823560132848">Software</translation> <translation id="8190193880870196235">Dikelola oleh ekstensi</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 39a06358..f8d6d56 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Stjórna</translation> <translation id="3816482573645936981">Gildi (leyst af hólmi)</translation> <translation id="382518646247711829">Ef þú notar proxy-þjón...</translation> +<translation id="3826050100957962900">Innskráning þriðja aðila</translation> <translation id="3827112369919217609">Fast</translation> <translation id="3827666161959873541">Fjölskyldumyndir</translation> <translation id="3828924085048779000">Ekki er leyft að hafa autt aðgangsorð.</translation> @@ -1333,6 +1334,7 @@ <translation id="4607603470419975064">Hnappurinn „Sjá ábendingar um Chrome“, ýttu á Enter til að fá frekari upplýsingar um eiginleika Chrome</translation> <translation id="4607608436550361748">Skoða ábendingar um Chrome</translation> <translation id="4617273035598175554">Hugbúnaður fyrir grafíska vinnslu og hreyfimyndagerð</translation> +<translation id="4627165777145349100">Nánar um þessa síðu</translation> <translation id="4627675673814409125">Ekki er hægt að stilla þessa reglu á prófílstigi Chrome og hún verður hunsuð.</translation> <translation id="4628948037717959914">Mynd</translation> <translation id="4631649115723685955">Fjárvildarkerfi tengt</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 7b300a26..4782c639 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -1052,6 +1052,7 @@ <translation id="3810973564298564668">Gestisci</translation> <translation id="3816482573645936981">Valore (sostituito)</translation> <translation id="382518646247711829">Se utilizzi un server proxy...</translation> +<translation id="3826050100957962900">Third-party sign-in</translation> <translation id="3827112369919217609">Assoluto</translation> <translation id="3827666161959873541">Film per la famiglia</translation> <translation id="3828924085048779000">Non è consentita una passphrase vuota.</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 72b2db39..db2f185 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">ניהול</translation> <translation id="3816482573645936981">ערך (הוחלף)</translation> <translation id="382518646247711829">אם עשית שימוש בשרת Proxy...</translation> +<translation id="3826050100957962900">כניסה של צד שלישי</translation> <translation id="3827112369919217609">מוחלט</translation> <translation id="3827666161959873541">סרטי משפחה</translation> <translation id="3828924085048779000">אין אפשרות להשתמש בביטוי סיסמה ריק.</translation> @@ -1331,6 +1332,7 @@ <translation id="4607603470419975064">לחצן להצגת טיפים של Chrome, מקישים על Enter כדי לקבל מידע על התכונות של Chrome</translation> <translation id="4607608436550361748">הצגת טיפים לשימוש ב-Chrome</translation> <translation id="4617273035598175554">תוכנות גרפיקה ואנימציה</translation> +<translation id="4627165777145349100">מידע נוסף על הדף הזה</translation> <translation id="4627675673814409125">לא ניתן להגדיר את המדיניות הזאת ברמה של פרופיל Chrome. המערכת תתעלם מהמדיניות.</translation> <translation id="4628948037717959914">תמונה</translation> <translation id="4631649115723685955">הקאשבק מקושר</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index cf7bc9fe..9b4beae 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">管理</translation> <translation id="3816482573645936981">値(優先)</translation> <translation id="382518646247711829">プロキシ サーバーを使用している場合...</translation> +<translation id="3826050100957962900">サードパーティのログイン</translation> <translation id="3827112369919217609">絶対的</translation> <translation id="3827666161959873541">ファミリー映画</translation> <translation id="3828924085048779000">パスフレーズは必ず指定してください。</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 0a6c80f4..cd208ea 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">მართვა</translation> <translation id="3816482573645936981">მნიშვნელობა (ჩანაცვლებული)</translation> <translation id="382518646247711829">თუ იყენებთ პროქსის სერვერს…</translation> +<translation id="3826050100957962900">სისტემაში შესვლა მესამე მხარის მეშვეობით</translation> <translation id="3827112369919217609">აბსოლუტური</translation> <translation id="3827666161959873541">საოჯახო ფილმები</translation> <translation id="3828924085048779000">ცარიელი პაროლი ნებადართული არ არის.</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 92c5270c..50564e0 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Басқару</translation> <translation id="3816482573645936981">Мән (ауыстырылған)</translation> <translation id="382518646247711829">Прокси серверді пайдалансаңыз…</translation> +<translation id="3826050100957962900">Үшінші тараптың кіруі</translation> <translation id="3827112369919217609">Абсолютті</translation> <translation id="3827666161959873541">Отбасылық фильмдер</translation> <translation id="3828924085048779000">Құпия фраза бос болмауы керек.</translation> @@ -1063,6 +1064,7 @@ <translation id="3835233591525155343">Құрылғыны пайдалануыңыз</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, жаңа Google құжатын жылдам жасау үшін Tab, содан кейін Enter пернесін басыңыз.</translation> <translation id="385051799172605136">Артқа</translation> +<translation id="3851515670389017037">Сеанстар парақшасы жабылды.</translation> <translation id="3858027520442213535">Күні мен уақытын жаңарту</translation> <translation id="3858860766373142691">Аты</translation> <translation id="3872834068356954457">Ғылым</translation> @@ -1363,6 +1365,7 @@ <translation id="470284880436071933">Қылмыс және әділсот</translation> <translation id="4704732901923281920">Биология ғылымдары</translation> <translation id="4708268264240856090">Байланыс үзілді</translation> +<translation id="4709819737903924300">Сеанстар парақшасы толық экранда ашылды.</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows Network Diagnostics құралын қосу<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" /> құпия сөзі</translation> @@ -1826,6 +1829,7 @@ <translation id="5989320800837274978">Бекітілген прокси серверлері де, .pac сценарий URL мекенжайы да көрсетілмеген.</translation> <translation id="5992691462791905444">Z тәрізді етіп жиі бүктеу</translation> <translation id="5995727681868049093">Google аккаунтыңыздағы ақпаратты, құпиялылықты және қауіпсіздікті басқару</translation> +<translation id="5997247540087773573">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Аккаунттарыңызды қорғау үшін Google Құпия сөз менеджері оны дереу өзгертуді және сақталған құпия сөздеріңізді тексеруді ұсынады.</translation> <translation id="6000758707621254961">"<ph name="SEARCH_TEXT" />" сұрауы бойынша <ph name="RESULT_COUNT" /> нәтиже шықты</translation> <translation id="6006484371116297560">Классикалық</translation> <translation id="6008122969617370890">N бастап 1 дейінгі ретпен</translation> @@ -1864,6 +1868,7 @@ <translation id="6061154937977953833">Күрес</translation> <translation id="6064217302520318294">Экран құлпы</translation> <translation id="6064602040258638498">Купондар мен жеңілдіктер</translation> +<translation id="6078813287646374487">Осы бет туралы толығырақ ақпарат көрсету</translation> <translation id="6080696365213338172">Мазмұнды әкімші берген сертификат көмегімен көрдіңіз. Сіз <ph name="DOMAIN" /> доменіне беретін деректерді әкімші ұстап алуы мүмкін.</translation> <translation id="6087312102907839798">Ұқсас іздеу сұраулары</translation> <translation id="6094273045989040137">Аннотация қосу</translation> @@ -2602,6 +2607,7 @@ <translation id="8163866351304776260">Сол жағын төрт рет тесу</translation> <translation id="8175796834047840627">Сіз аккаунтқа кіргендіктен, Chrome браузері карталарыңызды Google аккаунтына сақтауды ұсынып отыр. Мұны параметрлерге кіріп өзгертуіңізге болады.</translation> <translation id="8176440868214972690">Бұл құрылғының әкімшісі келесі веб-сайттарға бірқатар ақпарат (мысалы, параметрлер немесе саясаттар) жіберді.</translation> +<translation id="8179003511148538426">Сеанстар парақшасы жартылай экранда ашылды.</translation> <translation id="8184538546369750125">Ғаламдық әдепкі параметрді пайдалану (рұқсат беру)</translation> <translation id="8186706823560132848">Бағдарламалық жасақтама</translation> <translation id="8190193880870196235">Кеңейтім арқылы басқарылады.</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index 8681d6d..6deb756 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -1058,6 +1058,7 @@ <translation id="3810973564298564668">គ្រប់គ្រង</translation> <translation id="3816482573645936981">តម្លៃ (បានជំនួស)</translation> <translation id="382518646247711829">ប្រសិនបើអ្នកប្រើម៉ាស៊ីនមេប្រូកស៊ី...</translation> +<translation id="3826050100957962900">ការចូលគណនីភាគីទីបី</translation> <translation id="3827112369919217609">ដាច់ខាត</translation> <translation id="3827666161959873541">ភាពយន្តលក្ខណៈគ្រួសារ</translation> <translation id="3828924085048779000">ឃ្លាសម្ងាត់ទទេមិនត្រូវបានអនុញ្ញាតទេ។</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index cff32f9..f3862e4 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -1050,6 +1050,7 @@ <translation id="3810973564298564668">ನಿರ್ವಹಿಸಿ</translation> <translation id="3816482573645936981">ಮೌಲ್ಯ (ರದ್ದುಗೊಳಿಸಿರುವುದು)</translation> <translation id="382518646247711829">ನೀವು ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಬಳಸಿದರೆ...</translation> +<translation id="3826050100957962900">ಥರ್ಡ್-ಪಾರ್ಟಿ ಸೈನ್ ಇನ್</translation> <translation id="3827112369919217609">ಪರಿಪೂರ್ಣ</translation> <translation id="3827666161959873541">ಕೌಟುಂಬಿಕ ಚಲನಚಿತ್ರಗಳು</translation> <translation id="3828924085048779000">ಖಾಲಿ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ.</translation> @@ -1324,6 +1325,7 @@ <translation id="4607603470419975064">Chrome ಸಲಹೆಗಳ ಬಟನ್ ನೋಡಿ, Chrome ಫೀಚರ್ಗಳ ಕುರಿತು ತಿಳಿಯಲು Enter ಒತ್ತಿ</translation> <translation id="4607608436550361748">Chrome ಸಲಹೆಗಳನ್ನು ನೋಡಿ</translation> <translation id="4617273035598175554">ಗ್ರಾಫಿಕ್ಸ್ ಮತ್ತು ಆ್ಯನಿಮೇಶನ್ ಸಾಫ್ಟ್ವೇರ್</translation> +<translation id="4627165777145349100">ಈ ಪುಟದ ಕುರಿತು ಇನ್ನಷ್ಟು</translation> <translation id="4627675673814409125">ಈ ನೀತಿಯನ್ನು Chrome ಪ್ರೊಫೈಲ್ ಮಟ್ಟದಲ್ಲಿ ಸೆಟ್ ಮಾಡುವುದಿಲ್ಲ ಹಾಗೂ ಅದನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="4628948037717959914">ಫೋಟೋ</translation> <translation id="4631649115723685955">ಕ್ಯಾಶ್ಬ್ಯಾಕ್ ಲಿಂಕ್ ಮಾಡಲಾಗಿದೆ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 5950f50..6b182615 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">관리</translation> <translation id="3816482573645936981">값(대체됨)</translation> <translation id="382518646247711829">프록시 서버를 사용하는 경우</translation> +<translation id="3826050100957962900">서드 파티 로그인</translation> <translation id="3827112369919217609">독립</translation> <translation id="3827666161959873541">가족 영화</translation> <translation id="3828924085048779000">암호를 빈 칸으로 두어서는 안 됩니다.</translation> @@ -1324,6 +1325,7 @@ <translation id="4607603470419975064">Chrome 도움말 보기 버튼, Enter를 눌러 Chrome 기능 자세히 알아보기</translation> <translation id="4607608436550361748">Chrome 도움말 보기</translation> <translation id="4617273035598175554">그래픽 및 애니메이션 소프트웨어</translation> +<translation id="4627165777145349100">이 페이지 자세히 알아보기</translation> <translation id="4627675673814409125">이 정책은 Chrome 프로필 수준에서 설정할 수 없으며 무시됩니다.</translation> <translation id="4628948037717959914">사진</translation> <translation id="4631649115723685955">캐시백 연결됨</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index ede115a..f7e81e6 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Башкаруу</translation> <translation id="3816482573645936981">Маани (алмаштырылган)</translation> <translation id="382518646247711829">Эгер прокси сервериңизди колдонсоңуз…</translation> +<translation id="3826050100957962900">Үчүнчү тараптын кирүү аракети</translation> <translation id="3827112369919217609">Абсолют</translation> <translation id="3827666161959873541">Үй-бүлөлүк тасмалар</translation> <translation id="3828924085048779000">Купуя сөз айкашын бош калтырууга болбойт.</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 0c92d8a..8d79125e 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">ຈັດການ</translation> <translation id="3816482573645936981">ຄ່າ (ແທນທີ່ແລ້ວ)</translation> <translation id="382518646247711829">ຖ້າທ່ານໃຊ້ເຊີບເວີພຣັອກຊີ...</translation> +<translation id="3826050100957962900">ການເຂົ້າສູ່ລະບົບຂອງພາກສ່ວນທີສາມ</translation> <translation id="3827112369919217609">Absolute</translation> <translation id="3827666161959873541">ໜັງສຳລັບຄອບຄົວ</translation> <translation id="3828924085048779000">ບໍ່ອະນຸຍາດໃຫ້ວະລີຜ່ານຫວ່າງເປົ່າໄດ້.</translation> @@ -1333,6 +1334,7 @@ <translation id="4607603470419975064">ປຸ່ມເບິ່ງເຄັດລັບ Chrome, ກົດ Enter ເພື່ອສຶກສາເພີ່ມເຕີມກ່ຽວກັບຄຸນສົມບັດ Chrome</translation> <translation id="4607608436550361748">ເບິ່ງເຄັດລັບ Chrome</translation> <translation id="4617273035598175554">ຊອບແວກຣາບຟິກ ແລະ ອະນິເມຊັນ</translation> +<translation id="4627165777145349100">ເພີ່ມເຕີມກ່ຽວກັບໜ້ານີ້</translation> <translation id="4627675673814409125">ບໍ່ສາມາດຕັ້ງນະໂຍບາຍນີ້ຢູ່ລະດັບໂປຣໄຟລ໌ Chrome ໄດ້ ແລະ ລະບົບຈະບໍ່ສົນໃຈ.</translation> <translation id="4628948037717959914">ຮູບຖ່າຍ</translation> <translation id="4631649115723685955">ເຊື່ອມໂຍງເງິນຄືນແລ້ວ</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index c417c62..a767ecb 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -1056,6 +1056,7 @@ <translation id="3810973564298564668">Tvarkyti</translation> <translation id="3816482573645936981">Vertė (pakeista)</translation> <translation id="382518646247711829">Jei naudojate tarpinį serverį…</translation> +<translation id="3826050100957962900">Trečiosios šalies prisijungimas</translation> <translation id="3827112369919217609">Absoliutus</translation> <translation id="3827666161959873541">Šeimai skirti filmai</translation> <translation id="3828924085048779000">Neleidžiama naudoti tuščios slaptafrazės.</translation> @@ -1065,6 +1066,7 @@ <translation id="3835233591525155343">Įrenginio naudojimas</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, paspauskite tabuliavimo klavišą, tada – „Enter“, jei norite greitai sukurti naują „Google“ dokumentą</translation> <translation id="385051799172605136">Atgal</translation> +<translation id="3851515670389017037">„Journeys“ uždaryta</translation> <translation id="3858027520442213535">Atnaujinti datą ir laiką</translation> <translation id="3858860766373142691">Pavadinimas</translation> <translation id="3872834068356954457">Mokslas</translation> @@ -1334,6 +1336,7 @@ <translation id="4607603470419975064">Mygtukas „Žr. „Chrome“ patarimus“ – paspauskite klavišą „Enter“, jei norite sužinoti apie „Chrome“ funkcijas</translation> <translation id="4607608436550361748">Žr. „Chrome“ patarimus</translation> <translation id="4617273035598175554">Grafikos ir animacijos programinė įranga</translation> +<translation id="4627165777145349100">Daugiau apie šį puslapį</translation> <translation id="4627675673814409125">Šios politikos negalima nustatyti „Chrome“ profilio lygiu ir jos bus nepaisoma.</translation> <translation id="4628948037717959914">Nuotrauka</translation> <translation id="4631649115723685955">Grynųjų grąžinimas susietas</translation> @@ -1364,6 +1367,7 @@ <translation id="470284880436071933">Nusikaltimai ir teisingumas</translation> <translation id="4704732901923281920">Biologijos mokslai</translation> <translation id="4708268264240856090">Ryšys nutrauktas</translation> +<translation id="4709819737903924300">„Journeys“ atidaryta per visą ekrano aukštį</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Paleistas įrankis „Windows Network Diagnostics“<ph name="END_LINK" />.</translation> <translation id="4722735765955348426"><ph name="USERNAME" /> slaptažodis</translation> @@ -1827,6 +1831,7 @@ <translation id="5989320800837274978">Nenurodyti nei fiksuoti įgaliotieji serveriai, nei .pac scenarijaus URL.</translation> <translation id="5992691462791905444">Neproporcingas Z formos perlenkimas</translation> <translation id="5995727681868049093">Tvarkykite savo informaciją, privatumo ir saugos nustatymus „Google“ paskyroje</translation> +<translation id="5997247540087773573">Slaptažodis, kurį ką tik naudojote, buvo atskleistas įvykus duomenų saugos pažeidimui. Siekiant apsaugoti jūsų paskyras, „Google“ slaptažodžių tvarkyklė rekomenduoja pakeisti jį dabar ir patikrinti išsaugotus slaptažodžius.</translation> <translation id="6000758707621254961">Rezultatų pagal užklausą „<ph name="SEARCH_TEXT" />“: <ph name="RESULT_COUNT" /></translation> <translation id="6006484371116297560">Klasikinė</translation> <translation id="6008122969617370890">Tvarka: nuo N iki 1</translation> @@ -1865,6 +1870,7 @@ <translation id="6061154937977953833">Imtynės</translation> <translation id="6064217302520318294">Ekrano užraktas</translation> <translation id="6064602040258638498">Kuponai ir nuolaidų pasiūlymai</translation> +<translation id="6078813287646374487">Rodyti daugiau informacijos apie šį puslapį</translation> <translation id="6080696365213338172">Pasiekėte turinį naudodami administratoriaus pateiktą sertifikatą. Duomenys, kuriuos pateikiate <ph name="DOMAIN" />, gali būti perimti administratoriaus.</translation> <translation id="6087312102907839798">Susijusios paieškos</translation> <translation id="6094273045989040137">Komentuoti</translation> @@ -2603,6 +2609,7 @@ <translation id="8163866351304776260">Keturios skylės kairėje</translation> <translation id="8175796834047840627">„Chrome“ siūlo išsaugoti korteles „Google“ paskyroje, nes esate prisijungę. Šią elgseną galite pakeisti nustatymuose.</translation> <translation id="8176440868214972690">Šio įrenginio administratorius nusiuntė tam tikros informacijos, pvz., informacijos apie nustatymus ar politikos nuostatas, toliau nurodytoms svetainėms.</translation> +<translation id="8179003511148538426">„Journeys“ atidaryta iki pusės ekrano aukščio</translation> <translation id="8184538546369750125">Naudoti visuotinį numatytąjį nustatymą (leisti)</translation> <translation id="8186706823560132848">Programinė įranga</translation> <translation id="8190193880870196235">Tvarkoma naudojant plėtinį</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index f52435e6..a030cbcb 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Pārvaldīt</translation> <translation id="3816482573645936981">Vērtība (aizstāta)</translation> <translation id="382518646247711829">Ja izmantojat starpniekserveri...</translation> +<translation id="3826050100957962900">Trešās puses pierakstīšanās</translation> <translation id="3827112369919217609">Pilnīga precizitāte</translation> <translation id="3827666161959873541">Ģimenes filmas</translation> <translation id="3828924085048779000">Tukša ieejas frāze nav atļauta.</translation> @@ -1332,6 +1333,7 @@ <translation id="4607603470419975064">Chrome padomu skatīšanas poga. Lai uzzinātu vairāk par Chrome funkcijām, nospiediet taustiņu Enter.</translation> <translation id="4607608436550361748">Skatīt Chrome padomus</translation> <translation id="4617273035598175554">Grafikas un animācijas programmatūra</translation> +<translation id="4627165777145349100">Vairāk par šo lapu</translation> <translation id="4627675673814409125">Šo politiku nevar iestatīt Chrome profila līmenī, un tā tiks ignorēta.</translation> <translation id="4628948037717959914">Fotoattēls</translation> <translation id="4631649115723685955">Saistīta skaidras naudas atmaksa</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 25e178b7..321b8851 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Управувај</translation> <translation id="3816482573645936981">Вредност (заменета)</translation> <translation id="382518646247711829">Ако користите прокси сервер...</translation> +<translation id="3826050100957962900">Најавување на трети страни</translation> <translation id="3827112369919217609">Апсолутна</translation> <translation id="3827666161959873541">Семејни филмови</translation> <translation id="3828924085048779000">Не е дозволена празна лозинка.</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index ae55acf..33fd3a3 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -1053,6 +1053,7 @@ <translation id="3810973564298564668">നിയന്ത്രിക്കൂ</translation> <translation id="3816482573645936981">മൂല്യം (പകരം മറ്റൊന്ന് സജീവം)</translation> <translation id="382518646247711829">നിങ്ങൾ ഒരു പ്രോക്സി സെർവർ ഉപയോഗിക്കുന്നെങ്കിൽ...</translation> +<translation id="3826050100957962900">മൂന്നാം കക്ഷി സൈൻ ഇൻ</translation> <translation id="3827112369919217609">അബ്സല്യൂട്ട്</translation> <translation id="3827666161959873541">കുടുംബ സിനിമകൾ</translation> <translation id="3828924085048779000">പാസ്ഫ്രെയ്സ് പൂരിപ്പിക്കാതിരിക്കാനാവില്ല.</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index c7b633d..3359ca5 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -1056,6 +1056,7 @@ <translation id="3810973564298564668">удирдах</translation> <translation id="3816482573645936981">Утга (хүчингүй болгосон)</translation> <translation id="382518646247711829">Хэрэв та прокси серверийг ашиглах бол ...</translation> +<translation id="3826050100957962900">Гуравдагч талын нэвтрэлт</translation> <translation id="3827112369919217609">Үнэмлэхүй</translation> <translation id="3827666161959873541">Гэр бүлийн кино</translation> <translation id="3828924085048779000">Хоосон нууц үгийг зөвшөөрөхгүй.</translation> @@ -1065,6 +1066,7 @@ <translation id="3835233591525155343">Таны төхөөрөмжийн ашиглалт</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, Шинэ Google Док шуурхай үүсгэхийн тулд эхлээд Tab, дараа нь Enter дээр дарна уу</translation> <translation id="385051799172605136">Буцах</translation> +<translation id="3851515670389017037">Аяллуудыг хаасан</translation> <translation id="3858027520442213535">Огноо болон цагийг шинэчлэх</translation> <translation id="3858860766373142691">Нэр</translation> <translation id="3872834068356954457">Шинжлэх ухаан</translation> @@ -1365,6 +1367,7 @@ <translation id="470284880436071933">Гэмт хэрэг, шударга ёс</translation> <translation id="4704732901923281920">Биологийн шинжлэх ухаан</translation> <translation id="4708268264240856090">Таны холболт тасарлаа</translation> +<translation id="4709819737903924300">Аяллуудыг бүрэн нээсэн байна</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows сүлжээний оношилгоог ажиллуулж байна<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" />-н нууц үг</translation> @@ -1828,6 +1831,7 @@ <translation id="5989320800837274978">Прокси серверүүд болон а.pac бичвэрийн холбоосын аль алиныг нь зааж өгөөгүй байна.</translation> <translation id="5992691462791905444">Инженерчлэлийн Z-нугалаа</translation> <translation id="5995727681868049093">Google Бүртгэлийнхээ мэдээлэл, нууцлал болон аюулгүй байдлыг удирдаарай</translation> +<translation id="5997247540087773573">Таны дөнгөж сая ашигласан нууц үгийг өгөгдлийн зөрчлөөс оллоо. Таны бүртгэлүүдийг хамгаалахын тулд Google Password Manager үүнийг одоо өөрчлөх болон хадгалсан нууц үгнүүдээ шалгахыг зөвлөж байна.</translation> <translation id="6000758707621254961">'<ph name="SEARCH_TEXT" />'-н <ph name="RESULT_COUNT" /> илэрц</translation> <translation id="6006484371116297560">Сонгодог</translation> <translation id="6008122969617370890">N-с 1 хүртэлх дараалал</translation> @@ -1866,6 +1870,7 @@ <translation id="6061154937977953833">Бөх</translation> <translation id="6064217302520318294">Дэлгэцийн түгжээ</translation> <translation id="6064602040258638498">Купон, хөнгөлөлтийн санал</translation> +<translation id="6078813287646374487">Энэ хуудасны талаар нэмэлт мэдээлэл харах</translation> <translation id="6080696365213338172">Та админ-аас өгсөн гэрчилгээг ашиглан контент руу нэвтэрсэн байна. Таны <ph name="DOMAIN" /> руу оруулсан өгөгдлийг админаас хориглож болно.</translation> <translation id="6087312102907839798">Холбоотой хайлтууд</translation> <translation id="6094273045989040137">Тэмдэглэгээ хийх</translation> @@ -2603,6 +2608,7 @@ <translation id="8163866351304776260">Зүүн ирмэг дагуу дөрвөн нүх цоолох</translation> <translation id="8175796834047840627">Та нэвтэрсэн тул Chrome таны картыг таны Google Бүртгэлд хадгалахыг санал болгож байна. Та энэ ажиллах төлөвийг тохиргоонд өөрчилж болно.</translation> <translation id="8176440868214972690">Энэ төхөөрөмжийн администратор дараах вебсайтууд руу тохиргоо эсвэл бодлого зэрэг зарим мэдээллийг илгээсэн.</translation> +<translation id="8179003511148538426">Аяллуудыг хагас нээсэн байна</translation> <translation id="8184538546369750125">Ерөнхий анхдагч хэлбэрийг ашиглах (зөвшөөрөх)</translation> <translation id="8186706823560132848">Програм хангамж</translation> <translation id="8190193880870196235">Өргөтгөлөөр удирддаг</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index aaac2b4..ab29ee02 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">व्यवस्थापित करा</translation> <translation id="3816482573645936981">मूल्य (अधिग्रहित केलेले)</translation> <translation id="382518646247711829">तुम्ही प्रॉक्सी सर्व्हर वापरत असल्यास...</translation> +<translation id="3826050100957962900">तृतीय पक्ष साइन इन</translation> <translation id="3827112369919217609">अॅब्सोल्यूट</translation> <translation id="3827666161959873541">कौटुंबिक चित्रपट</translation> <translation id="3828924085048779000">रिक्त सांकेतिक पासफ्रेझाची परवानगी नाही.</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 99f398ea..7ee1b0951 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -1056,6 +1056,7 @@ <translation id="3810973564298564668">Urus</translation> <translation id="3816482573645936981">Nilai (digantikan)</translation> <translation id="382518646247711829">Jika anda menggunakan pelayan proksi...</translation> +<translation id="3826050100957962900">Log masuk pihak ketiga</translation> <translation id="3827112369919217609">Mutlak</translation> <translation id="3827666161959873541">Filem keluarga</translation> <translation id="3828924085048779000">Kosongkan frasa laluan adalah tidak dibenarkan.</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index d97f848..1ab960e 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">စီမံရန်</translation> <translation id="3816482573645936981">တန်ဖိုး (အစားထိုးထားသည်)</translation> <translation id="382518646247711829">သင်သည် ပရောက်စီ ဆာဗာ သုံးနေလျှင်...</translation> +<translation id="3826050100957962900">ပြင်ပအဖွဲ့အစည်းသို့ လက်မှတ်ထိုးဝင်ခြင်း</translation> <translation id="3827112369919217609">အပြည့်အဝ</translation> <translation id="3827666161959873541">မိသားစု ရုပ်ရှင်များ</translation> <translation id="3828924085048779000">စကားစုဝှက် ပလာ ဖြစ်မှု ခွင့်မပြုပါ။</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index 3698d669..dea9483 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -1052,6 +1052,7 @@ <translation id="3810973564298564668">व्यवस्थित गर्नुहोस्</translation> <translation id="3816482573645936981">मान (यो मानको साटो लागू गरिएको)</translation> <translation id="382518646247711829">यदि तपाईंले कुनै एउटा प्रोक्सी सर्भर प्रयोग गर्नुभयो भने ...</translation> +<translation id="3826050100957962900">तेस्रो पक्षीय साइन इन</translation> <translation id="3827112369919217609">निरपेक्ष</translation> <translation id="3827666161959873541">पारिवारिक चलचित्रहरू</translation> <translation id="3828924085048779000">खाली पासफ्रेजको लागि अनुमति छैन।</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index a1c7abe..1358232 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -1047,6 +1047,7 @@ <translation id="3810973564298564668">Beheren</translation> <translation id="3816482573645936981">Waarde (vervangen)</translation> <translation id="382518646247711829">Als je een proxyserver gebruikt...</translation> +<translation id="3826050100957962900">Externe login</translation> <translation id="3827112369919217609">Absoluut</translation> <translation id="3827666161959873541">Familiefilms</translation> <translation id="3828924085048779000">Een lege wachtwoordzin is niet toegestaan.</translation> @@ -1056,6 +1057,7 @@ <translation id="3835233591525155343">Je apparaatgebruik</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, druk op Tab en daarna op Enter om snel een nieuw Google-document te maken</translation> <translation id="385051799172605136">Terug</translation> +<translation id="3851515670389017037">Trajecten gesloten</translation> <translation id="3858027520442213535">Datum en tijd updaten</translation> <translation id="3858860766373142691">Naam</translation> <translation id="3872834068356954457">Wetenschap</translation> @@ -1356,6 +1358,7 @@ <translation id="470284880436071933">Misdaad en misdaadbestrijding</translation> <translation id="4704732901923281920">Biologie</translation> <translation id="4708268264240856090">Je verbinding is onderbroken</translation> +<translation id="4709819737903924300">Trajecten geopend op volledige hoogte</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows Netwerkcontrole uitvoeren<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Wachtwoord voor <ph name="USERNAME" /></translation> @@ -1819,6 +1822,7 @@ <translation id="5989320800837274978">Er worden geen vaste proxyservers en geen pac-script-URL gespecificeerd.</translation> <translation id="5992691462791905444">Zizagvouw 2-slag oneven center</translation> <translation id="5995727681868049093">Je gegevens, privacy en beveiliging beheren in je Google-account</translation> +<translation id="5997247540087773573">Het wachtwoord dat je net hebt gebruikt, is gevonden bij een gegevenslek. Google Wachtwoordmanager raadt je aan dit wachtwoord nu te wijzigen en je opgeslagen wachtwoorden te checken om je account te beveiligen.</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> resultaten voor '<ph name="SEARCH_TEXT" />'</translation> <translation id="6006484371116297560">Klassiek</translation> <translation id="6008122969617370890">Volgorde: van N naar 1</translation> @@ -1857,6 +1861,7 @@ <translation id="6061154937977953833">Worstelen</translation> <translation id="6064217302520318294">Schermvergrendeling</translation> <translation id="6064602040258638498">Kortingsbonnen en kortingsacties</translation> +<translation id="6078813287646374487">Meer informatie over deze pagina tonen</translation> <translation id="6080696365213338172">Je hebt toegang tot content gekregen met behulp van een certificaat van je beheerder. Gegevens die je verstrekt aan <ph name="DOMAIN" />, kunnen door je beheerder worden onderschept.</translation> <translation id="6087312102907839798">Gerelateerde zoekopdrachten</translation> <translation id="6094273045989040137">Aantekeningen maken</translation> @@ -2594,6 +2599,7 @@ <translation id="8163866351304776260">Vier perforaties links</translation> <translation id="8175796834047840627">Chrome biedt aan je passen in je Google-account op te slaan omdat je bent ingelogd. Je kunt dit wijzigen in de instellingen.</translation> <translation id="8176440868214972690">De beheerder van dit apparaat heeft bepaalde gegevens gestuurd naar de volgende websites, zoals instellingen of beleidsregels.</translation> +<translation id="8179003511148538426">Trajecten geopend op halve hoogte</translation> <translation id="8184538546369750125">Algemene standaardinstelling gebruiken (Toestaan)</translation> <translation id="8186706823560132848">Software</translation> <translation id="8190193880870196235">Beheerd door een extensie</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 809b85a..5b2a337 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Administrer</translation> <translation id="3816482573645936981">Verdi (overstyrt)</translation> <translation id="382518646247711829">Hvis du bruker en proxy-tjener...</translation> +<translation id="3826050100957962900">Tredjepartspålogging</translation> <translation id="3827112369919217609">Absolutt</translation> <translation id="3827666161959873541">Familiefilmer</translation> <translation id="3828924085048779000">Tom passordfrase er ikke tillatt.</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 2ac9c20f..dd2e1fc 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -1048,6 +1048,7 @@ <translation id="3810973564298564668">ପରିଚାଳନା</translation> <translation id="3816482573645936981">ମୂଲ୍ୟ (ଏହାର ସ୍ଥାନ ଅଧିକାର କରାଯାଇଛି)</translation> <translation id="382518646247711829">ଯଦି ଆପଣ ଏକ ପ୍ରକ୍ସି ସର୍ଭର ବ୍ୟବହାର କରନ୍ତି...</translation> +<translation id="3826050100957962900">ତୃତୀୟ-ପକ୍ଷ ସାଇନ-ଇନ</translation> <translation id="3827112369919217609">ସମ୍ପୂର୍ଣ୍ଣ</translation> <translation id="3827666161959873541">ପାରିବାରିକ ମୁଭିଗୁଡ଼ିକ</translation> <translation id="3828924085048779000">ଶୂନ୍ୟ ପାସ୍ଫ୍ରେଜ୍ର ଅନୁମତି ନାହିଁ।</translation> @@ -1321,6 +1322,7 @@ <translation id="4607603470419975064">"Chrome ଟିପ୍ସ ଦେଖନ୍ତୁ" ବଟନ୍, Chromeର ଫିଚରଗୁଡ଼ିକ ବିଷୟରେ ଜାଣିବା ପାଇଁ Enter ଦବାନ୍ତୁ</translation> <translation id="4607608436550361748">Chrome ଟିପ୍ସ ଦେଖନ୍ତୁ</translation> <translation id="4617273035598175554">ଗ୍ରାଫିକ୍ସ ଏବଂ ଆନିମେସନ ସଫ୍ଟୱେର</translation> +<translation id="4627165777145349100">ଏହି ପୃଷ୍ଠା ବିଷୟରେ ଅଧିକ</translation> <translation id="4627675673814409125">ଏହି ନୀତିକୁ Chrome ପ୍ରୋଫାଇଲ ଲେଭେଲରେ ସେଟ କରାଯାଇପାରିବ ନାହିଁ ଏବଂ ଏହାକୁ ଅଣଦେଖା କରାଯିବ।</translation> <translation id="4628948037717959914">ଫଟୋ</translation> <translation id="4631649115723685955">କ୍ୟାସବ୍ୟାକ୍ ଲିଙ୍କ୍ କରାଯାଇଛି</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 821f173..24b1343f 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -1048,6 +1048,7 @@ <translation id="3810973564298564668">ਵਿਵਸਥਿਤ ਕਰੋ</translation> <translation id="3816482573645936981">ਮੁੱਲ (ਪ੍ਰਤਿਸਥਾਪਨ ਕੀਤਾ)</translation> <translation id="382518646247711829">ਜੇਕਰ ਤੁਸੀਂ ਇੱਕ ਪ੍ਰੌਕਸੀ ਸਰਵਰ ਵਰਤਦੇ ਹੋ...</translation> +<translation id="3826050100957962900">ਤੀਜੀ-ਧਿਰ ਦਾ ਸਾਈਨ-ਇਨ</translation> <translation id="3827112369919217609">ਸੰਪੂਰਨ</translation> <translation id="3827666161959873541">ਪਰਿਵਾਰਕ ਫ਼ਿਲਮਾਂ</translation> <translation id="3828924085048779000">ਖਾਲੀ ਪਾਸਫਰੇਜ਼ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।</translation> @@ -1057,6 +1058,7 @@ <translation id="3835233591525155343">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, ਤੇਜ਼ੀ ਨਾਲ ਨਵਾਂ Google ਡੌਕ ਬਣਾਉਣ ਲਈ Tab ਦਬਾ ਕੇ ਫਿਰ Enter ਦਬਾਓ</translation> <translation id="385051799172605136">ਪਿੱਛੇ</translation> +<translation id="3851515670389017037">'ਖੋਜ ਸਫ਼ਰ' ਹੇਠਲੀ ਸ਼ੀਟ ਬੰਦ ਹੈ</translation> <translation id="3858027520442213535">ਤਾਰੀਖ ਅਤੇ ਸਮਾਂ ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="3858860766373142691">ਨਾਮ</translation> <translation id="3872834068356954457">ਵਿਗਿਆਨ</translation> @@ -1352,6 +1354,7 @@ <translation id="470284880436071933">ਜੁਰਮ ਅਤੇ ਨਿਆਂ</translation> <translation id="4704732901923281920">ਜੀਵ ਸੰਬੰਧੀ ਵਿਗਿਆਨ</translation> <translation id="4708268264240856090">ਤੁਹਾਡੇ ਕਨੈਕਸ਼ਨ ਵਿੱਚ ਰੁਕਾਵਟ ਆਈ ਸੀ</translation> +<translation id="4709819737903924300">'ਖੋਜ ਸਫ਼ਰ' ਹੇਠਲੀ ਸ਼ੀਟ ਪੂਰੀ ਉਚਾਈ ਤੱਕ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows ਨੈੱਟਵਰਕ ਤਸ਼ਖੀਸ ਚਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" /> ਦਾ ਪਾਸਵਰਡ</translation> @@ -1815,6 +1818,7 @@ <translation id="5989320800837274978">ਨਾ ਤਾਂ ਸਥਿਰ ਪ੍ਰੌਕਸੀ ਸਰਵਰ ਨਾ ਹੀ .pac ਸਕ੍ਰਿਪਟ URL ਨਿਰਦਿਸ਼ਟ ਕੀਤੇ ਗਏ ਹਨ।</translation> <translation id="5992691462791905444">ਇੰਜੀਨੀਅਰਿੰਗ Z-ਤਹਿ</translation> <translation id="5995727681868049093">ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਆਪਣੀ ਜਾਣਕਾਰੀ, ਪਰਦੇਦਾਰੀ ਅਤੇ ਸੁਰੱਖਿਆ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> +<translation id="5997247540087773573">ਤੁਹਾਡੇ ਵੱਲੋਂ ਹੁਣੇ ਹੀ ਵਰਤਿਆ ਗਿਆ ਪਾਸਵਰਡ ਡਾਟਾ ਉਲੰਘਣਾ ਵਿੱਚ ਮਿਲਿਆ ਸੀ। ਆਪਣੇ ਖਾਤਿਆਂ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰਨ ਲਈ, Google Password Manager ਇਸਨੂੰ ਹੁਣੇ ਬਦਲਣ ਅਤੇ ਫਿਰ ਤੁਹਾਡੇ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕਰਦਾ ਹੈ।</translation> <translation id="6000758707621254961">'<ph name="SEARCH_TEXT" />' ਲਈ <ph name="RESULT_COUNT" /> ਨਤੀਜੇ</translation> <translation id="6006484371116297560">ਕਲਾਸਿਕ</translation> <translation id="6008122969617370890">N-ਤੋਂ-1 ਕ੍ਰਮ</translation> @@ -1853,6 +1857,7 @@ <translation id="6061154937977953833">ਕੁਸ਼ਤੀ</translation> <translation id="6064217302520318294">ਸਕ੍ਰੀਨ ਲੌਕ</translation> <translation id="6064602040258638498">ਕੂਪਨ ਅਤੇ ਛੋਟ ਪੇਸ਼ਕਸ਼ਾਂ</translation> +<translation id="6078813287646374487">ਇਸ ਪੰਨੇ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਦਿਖਾਓ</translation> <translation id="6080696365213338172">ਤੁਸੀਂ ਇੱਕ ਪ੍ਰਬੰਧਕ ਵੱਲੋਂ-ਮੁਹੱਈਆ ਕੀਤਾ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਵਰਤਦੇ ਹੋਏ ਸਮੱਗਰੀ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕੀਤੀ ਹੈ। ਜੋ ਡਾਟਾ ਤੁਸੀਂ <ph name="DOMAIN" /> ਨੂੰ ਮੁਹੱਈਆ ਕਰਦੇ ਹੋ, ਉਹ ਤੁਹਾਡੇ ਪ੍ਰਬੰਧਕ ਵੱਲੋਂ ਰੋਕਿਆ ਜਾ ਸਕਦਾ ਹੈ।</translation> <translation id="6087312102907839798">ਸੰਬੰਧਿਤ ਖੋਜਾਂ</translation> <translation id="6094273045989040137">ਐਨੋਟੇਟ ਕਰੋ</translation> @@ -2590,6 +2595,7 @@ <translation id="8163866351304776260">ਖੱਬੇ ਪਾਸੇ ਚਾਰ ਮੋਰੀਆਂ</translation> <translation id="8175796834047840627">ਤੁਹਾਡੇ ਸਾਈਨ-ਇਨ ਹੋਣ ਕਰਕੇ Chrome ਤੁਹਾਡੇ ਕਾਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰ ਰਿਹਾ ਹੈ। ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸ ਵਤੀਰੇ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="8176440868214972690">ਇਸ ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਅੱਗੇ ਦਿੱਤੀਆਂ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਕੁਝ ਜਾਣਕਾਰੀ ਭੇਜੀ ਹੈ, ਜਿਵੇਂ ਸੈਟਿੰਗਾਂ ਜਾਂ ਨੀਤੀਆਂ।</translation> +<translation id="8179003511148538426">'ਖੋਜ ਸਫ਼ਰ' ਹੇਠਲੀ ਸ਼ੀਟ ਅੱਧੀ ਉਚਾਈ ਤੱਕ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ</translation> <translation id="8184538546369750125">ਗਲੋਬਲ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ (ਇਜਾਜ਼ਤ ਦਿਓ)</translation> <translation id="8186706823560132848">ਸਾਫਟਵੇਅਰ</translation> <translation id="8190193880870196235">ਕਿਸੇ ਐਕਸਟੈਂਸ਼ਨ ਵੱਲੋਂ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index c5129ae..a51fba6 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">Zarządzaj</translation> <translation id="3816482573645936981">Wartość (zastąpiona)</translation> <translation id="382518646247711829">Jeśli używasz serwera proxy...</translation> +<translation id="3826050100957962900">Logowanie się w przypadku innych firm</translation> <translation id="3827112369919217609">Bezwzględna</translation> <translation id="3827666161959873541">Kino familijne</translation> <translation id="3828924085048779000">Puste hasło jest niedozwolone.</translation> @@ -1060,6 +1061,7 @@ <translation id="3835233591525155343">Korzystanie z urządzenia</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />; naciśnij Tab, a potem Enter, aby szybko utworzyć nowy dokument Google</translation> <translation id="385051799172605136">Wstecz</translation> +<translation id="3851515670389017037">Seria czynności jest zamknięta</translation> <translation id="3858027520442213535">Zaktualizuj datę i godzinę</translation> <translation id="3858860766373142691">Nazwa</translation> <translation id="3872834068356954457">Nauka</translation> @@ -1355,6 +1357,7 @@ <translation id="470284880436071933">Przestępstwa i wymiar sprawiedliwości</translation> <translation id="4704732901923281920">Nauki biologiczne</translation> <translation id="4708268264240856090">Połączenie zostało przerwane</translation> +<translation id="4709819737903924300">Seria czynności jest otwarta na całej wysokości</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Uruchom Diagnostykę sieci systemu Windows<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Hasło użytkownika <ph name="USERNAME" /></translation> @@ -1818,6 +1821,7 @@ <translation id="5989320800837274978">Nie określono ani stałych serwerów proxy, ani adresu URL skryptu PAC.</translation> <translation id="5992691462791905444">Składanie typu Z</translation> <translation id="5995727681868049093">Zarządzaj swoimi danymi, prywatnością i bezpieczeństwem na koncie Google</translation> +<translation id="5997247540087773573">Znaleźliśmy użyte właśnie hasło wśród ujawnionych w wyniku naruszenia bezpieczeństwa danych. Menedżer haseł Google zaleca natychmiastową zmianę tego hasła oraz sprawdzenie innych zapisanych haseł – pozwoli to zabezpieczyć Twoje konta.</translation> <translation id="6000758707621254961">Wyniki wyszukiwania dla zapytania „<ph name="SEARCH_TEXT" />”: <ph name="RESULT_COUNT" /></translation> <translation id="6006484371116297560">Klasyczny</translation> <translation id="6008122969617370890">Kolejność od N do 1</translation> @@ -1856,6 +1860,7 @@ <translation id="6061154937977953833">Zapasy</translation> <translation id="6064217302520318294">Blokada ekranu</translation> <translation id="6064602040258638498">Kupony i zniżki</translation> +<translation id="6078813287646374487">Pokaż więcej informacji o tej stronie</translation> <translation id="6080696365213338172">Masz dostęp do treści dzięki certyfikatowi dostarczonemu przez administratora. Administrator może odczytać dane, jakie udostępnisz w <ph name="DOMAIN" />.</translation> <translation id="6087312102907839798">Podobne wyszukiwania</translation> <translation id="6094273045989040137">Dodaj adnotacje</translation> @@ -2594,6 +2599,7 @@ <translation id="8163866351304776260">Cztery otwory po lewej</translation> <translation id="8175796834047840627">Jako zalogowany użytkownik możesz zapisać karty na Twoim koncie Google w Chrome. Możesz to zmienić w ustawieniach.</translation> <translation id="8176440868214972690">Administrator tego urządzenia wysłał do tych witryn pewne informacje, takie jak ustawienia lub zasady.</translation> +<translation id="8179003511148538426">Seria czynności jest otwarta do połowy wysokości</translation> <translation id="8184538546369750125">Użyj globalnej wartości domyślnej (Zezwalaj)</translation> <translation id="8186706823560132848">Oprogramowanie</translation> <translation id="8190193880870196235">Zarządzane przez rozszerzenie</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index be2fa17..91ae48f 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">Gerenciar</translation> <translation id="3816482573645936981">Valor (substituído)</translation> <translation id="382518646247711829">Se você usa um servidor proxy...</translation> +<translation id="3826050100957962900">Login de terceiros</translation> <translation id="3827112369919217609">Absoluto</translation> <translation id="3827666161959873541">Filmes para a família</translation> <translation id="3828924085048779000">Uma senha vazia não é permitida.</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index da1cb72..649214b 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Administrar</translation> <translation id="3816482573645936981">Valor (substituído)</translation> <translation id="382518646247711829">Se utilizar um servidor de proxy...</translation> +<translation id="3826050100957962900">Início de sessão de terceiros</translation> <translation id="3827112369919217609">Absoluto</translation> <translation id="3827666161959873541">Filmes de família</translation> <translation id="3828924085048779000">Não é permitida uma frase de acesso vazia.</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 2dd351f1..2fe0f6e 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Gestionează</translation> <translation id="3816482573645936981">Valoare (înlocuită)</translation> <translation id="382518646247711829">Dacă utilizați un server proxy...</translation> +<translation id="3826050100957962900">Third-party sign-in</translation> <translation id="3827112369919217609">Absolută</translation> <translation id="3827666161959873541">Filme pentru toată familia</translation> <translation id="3828924085048779000">Trebuie să fie introdusă expresia de acces.</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 6663c6c..e89abcf9 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -1050,6 +1050,7 @@ <translation id="3810973564298564668">Перейти</translation> <translation id="3816482573645936981">Значение (заменяемое)</translation> <translation id="382518646247711829">Если вы используете прокси-сервер...</translation> +<translation id="3826050100957962900">Предложения войти в аккаунт от третьих сторон</translation> <translation id="3827112369919217609">Абсолютный</translation> <translation id="3827666161959873541">Семейные фильмы</translation> <translation id="3828924085048779000">Пустые кодовые фразы запрещены.</translation> @@ -1059,6 +1060,7 @@ <translation id="3835233591525155343">Использование устройства</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />. Чтобы быстро создать документ Google, нажмите Tab, а затем Ввод.</translation> <translation id="385051799172605136">Назад</translation> +<translation id="3851515670389017037">Сеансы закрыты</translation> <translation id="3858027520442213535">Обновить дату и время</translation> <translation id="3858860766373142691">Название</translation> <translation id="3872834068356954457">Наука</translation> @@ -1354,6 +1356,7 @@ <translation id="470284880436071933">Преступления и правосудие</translation> <translation id="4704732901923281920">Биологические науки</translation> <translation id="4708268264240856090">Соединение прервано</translation> +<translation id="4709819737903924300">Окно с сеансами развернуто на весь экран</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Выполните диагностику сети в Windows<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Пароль аккаунта пользователя <ph name="USERNAME" /></translation> @@ -1817,6 +1820,7 @@ <translation id="5989320800837274978">Ни фиксированные прокси-серверы, ни URL PAC-скриптов не указаны.</translation> <translation id="5992691462791905444">Укороченная фальцовка гармошкой</translation> <translation id="5995727681868049093">Настроить параметры конфиденциальности и безопасности в аккаунте Google</translation> +<translation id="5997247540087773573">Пароль, который вы только что использовали, был раскрыт в результате утечки данных. Чтобы защитить свои аккаунты, измените его прямо сейчас и проверьте сохраненные пароли в Google Менеджере паролей.</translation> <translation id="6000758707621254961">Количество результатов поиска по запросу "<ph name="SEARCH_TEXT" />": <ph name="RESULT_COUNT" /></translation> <translation id="6006484371116297560">Классическая</translation> <translation id="6008122969617370890">В порядке от N до 1</translation> @@ -1855,6 +1859,7 @@ <translation id="6061154937977953833">Борьба</translation> <translation id="6064217302520318294">Блокировка экрана</translation> <translation id="6064602040258638498">Купоны и скидки</translation> +<translation id="6078813287646374487">Показать дополнительную информацию об этой странице</translation> <translation id="6080696365213338172">Вы используете сертификат, предоставленный администратором, поэтому он может заблокировать передачу данных на сайт <ph name="DOMAIN" />.</translation> <translation id="6087312102907839798">Связанные запросы</translation> <translation id="6094273045989040137">Аннотировать</translation> @@ -2593,6 +2598,7 @@ <translation id="8163866351304776260">Четыре отверстия слева</translation> <translation id="8175796834047840627">Chrome предлагает вам сохранить карты в аккаунте Google, поскольку вы вошли в систему. Этот параметр можно изменить в разделе настроек.</translation> <translation id="8176440868214972690">Администратор устройства отправил на следующие веб-сайты некоторые данные, такие как настройки и правила.</translation> +<translation id="8179003511148538426">Сеансы показаны в нижней половине экрана</translation> <translation id="8184538546369750125">Использовать глобальный параметр по умолчанию (разрешать)</translation> <translation id="8186706823560132848">Программное обеспечение</translation> <translation id="8190193880870196235">Управляется расширением</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index 9d4a9d4..57cd54fb 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">කළමනාකරණය</translation> <translation id="3816482573645936981">අගය (ඉක්මවා ඇත)</translation> <translation id="382518646247711829">ඔබ ප්රොක්සි සර්වරය භාවිතා කළහොත්...</translation> +<translation id="3826050100957962900">තුන්වන පාර්ශ්ව පිරීම</translation> <translation id="3827112369919217609">නියත</translation> <translation id="3827666161959873541">පවුලේ චිත්රපට</translation> <translation id="3828924085048779000">හිස් රහස්පද ඉඩ නොදේ.</translation> @@ -1064,6 +1065,7 @@ <translation id="3835233591525155343">ඔබගේ උපාංග භාවිතය</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, ඉක්මනින් නව Google Doc එකක් තැනීමට Tab ඔබා අනතුරුව Enter ඔබන්න</translation> <translation id="385051799172605136">ආපසු</translation> +<translation id="3851515670389017037">චාරිකා අවසන් විය</translation> <translation id="3858027520442213535">දිනය සහ වේලාව යාවත්කාලීන කරන්න</translation> <translation id="3858860766373142691">නම</translation> <translation id="3872834068356954457">විද්යාව</translation> @@ -1330,6 +1332,7 @@ <translation id="4607603470419975064">Chrome ඉඟි බොත්තම බලන්න, Chrome විශේෂාංග ගැන දැන ගැනීමට Enter ඔබන්න</translation> <translation id="4607608436550361748">Chrome ඉඟි බලන්න</translation> <translation id="4617273035598175554">චිත්රක සහ සජීවිකරණ මෘදුකාංග</translation> +<translation id="4627165777145349100">මෙම පිටුව පිළිබඳ වැඩිදුර</translation> <translation id="4627675673814409125">මෙම ප්රතිපත්තිය Chrome පැතිකඩ මට්ටමේදී සැකසිය නොහැකි අතර නොසලකා හරිනු ඇත.</translation> <translation id="4628948037717959914">ඡායාරූපය</translation> <translation id="4631649115723685955">මුදල් ආපසු දීම සබැඳි කරන ලදි</translation> @@ -1360,6 +1363,7 @@ <translation id="470284880436071933">අපරාධ සහ සාධාරණත්වය</translation> <translation id="4704732901923281920">ජෛව විද්යාව</translation> <translation id="4708268264240856090">ඔබේ සබැඳුමට බාධා ඇති විය</translation> +<translation id="4709819737903924300">සම්පූර්ණ උසින් චාරිකා විවෘත විය</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows ජාල දෝෂහරණ ධාවනය කරමින්<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" /> සඳහා මුරපදය</translation> @@ -1823,6 +1827,7 @@ <translation id="5989320800837274978">ස්ථිර ප්රොක්සි සේවාදායක හෝ .pac ස්ක්රිප්ට ලිපින සඳහන් කර නොමැත.</translation> <translation id="5992691462791905444">ඉංජිනේරු විද්යා Z-නැමීම</translation> <translation id="5995727681868049093">ඔබගේ Google ගිණුම තුළ ඔබගේ තොරතුරු, පෞද්ගලිකත්වය සහ ආරක්ෂාව කළමනාකරණය කරන්න</translation> +<translation id="5997247540087773573">ඔබ මේ දැන් භාවිත කළ මුරපදය දත්ත කඩ කිරීමකදී සොයා ගන්නා ලදී. ඔබගේ ගිණුම් සුරක්ෂිත කිරීමට, Google මුරපද කළමනාකරු එය දැන් වෙනස් කර ඔබගේ සුරකින ලද මුරපද පරීක්ෂා කිරීම නිර්දේශ කරයි.</translation> <translation id="6000758707621254961">'<ph name="SEARCH_TEXT" />' සඳහා ප්රතිඵල <ph name="RESULT_COUNT" />ක්</translation> <translation id="6006484371116297560">පැරණි</translation> <translation id="6008122969617370890">N-සිට-1 පිළිවෙළ</translation> @@ -1861,6 +1866,7 @@ <translation id="6061154937977953833">මල්ලව පොර</translation> <translation id="6064217302520318294">තිර අගුල</translation> <translation id="6064602040258638498">කුපන් සහ වට්ටම් දීමනා</translation> +<translation id="6078813287646374487">මෙම පිටුව පිළිබඳ වැඩි විස්තර පෙන්වන්න</translation> <translation id="6080696365213338172">ඔබ විසින් අන්තර්ගතයන්ට පිවිසී ඇත්තේ පරිපාලක-නිකුතු සහතිකයක් භාවිත කරමිනි. ඔබ <ph name="DOMAIN" /> වෙත ලබා දෙන තොරතුරු පරිපාලක හටද ලැබෙනු ඇත.</translation> <translation id="6087312102907839798">අදාළ සෙවීම්</translation> <translation id="6094273045989040137">අනුසටහන් කරන්න</translation> @@ -2599,6 +2605,7 @@ <translation id="8163866351304776260">වමට සිවු වරක් අනින්න</translation> <translation id="8175796834047840627">ඔබ පුරනය වී සිටින බැවින් Chrome ඔබට ඔබේ කාඩ්පත් ඔබේ Google ගිණුමට සුරැකීම පිරිනමයි. ඔබට මෙම හැසිරීම සැකසීම් තුළ වෙනස් කළ හැක.</translation> <translation id="8176440868214972690">සැකසීම් හෝ ප්රතිපත්ති වැනි, පහත සඳහන් වෙබ් අඩවි වෙත මෙම උපාංගයේ පරිපාලක යම් තොරතුරු යවා ඇත.</translation> +<translation id="8179003511148538426">අඩ උසින් චාරිකා විවෘත විය</translation> <translation id="8184538546369750125">ගෝලීය පෙරනිමිය භාවිතා කරන්න (අවසර)</translation> <translation id="8186706823560132848">මෘදුකාංගය</translation> <translation id="8190193880870196235">දිගුවක් මගින් කළමනාකරණය කෙරේ</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 00c4ddd..c30af41 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -1047,6 +1047,7 @@ <translation id="3810973564298564668">Spravovať</translation> <translation id="3816482573645936981">Hodnota (nahradená)</translation> <translation id="382518646247711829">Ak používate server proxy...</translation> +<translation id="3826050100957962900">Prihlásenie tretej strany</translation> <translation id="3827112369919217609">Absolútne</translation> <translation id="3827666161959873541">Rodinné filmy</translation> <translation id="3828924085048779000">Prístupová fráza nemôže byť prázdna.</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 4af5a6e77..3e955a8c 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Upravljaj</translation> <translation id="3816482573645936981">Vrednost (nadomeščena)</translation> <translation id="382518646247711829">Če uporabite namestniški strežnik ...</translation> +<translation id="3826050100957962900">Prijava prek zunanjih ponudnikov</translation> <translation id="3827112369919217609">Absolutno</translation> <translation id="3827666161959873541">Družinski filmi</translation> <translation id="3828924085048779000">Prazno geslo ni dovoljeno.</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 505c354..a601223 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Menaxho</translation> <translation id="3816482573645936981">Vlera (e zëvendësuar)</translation> <translation id="382518646247711829">Nëse përdor një server përfaqësues...</translation> +<translation id="3826050100957962900">Identifikimi i palëve të treta</translation> <translation id="3827112369919217609">Absolut</translation> <translation id="3827666161959873541">Filmat për familjen</translation> <translation id="3828924085048779000">Lënia bosh e frazës së kalimit nuk lejohet.</translation> @@ -1330,6 +1331,7 @@ <translation id="4607603470419975064">Butoni "Shiko këshilla për Chrome", shtyp Enter për të mësuar për veçoritë e Chrome</translation> <translation id="4607608436550361748">Shiko këshillat për Chrome</translation> <translation id="4617273035598175554">Softuerët për grafika dhe animim</translation> +<translation id="4627165777145349100">Më shumë rreth kësaj faqeje</translation> <translation id="4627675673814409125">Kjo politikë nuk mund të caktohet në nivelin e profilit të Chrome dhe do të shpërfillet.</translation> <translation id="4628948037717959914">Fotografia</translation> <translation id="4631649115723685955">Oferta e kthimit të parave është e lidhur</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 3e2c22c..d481a96 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Upravljaj</translation> <translation id="3816482573645936981">Vrednost (zamenjena)</translation> <translation id="382518646247711829">Ako koristite proksi server...</translation> +<translation id="3826050100957962900">Prijavljivanje treće strane</translation> <translation id="3827112369919217609">Apsolut</translation> <translation id="3827666161959873541">Porodični filmovi</translation> <translation id="3828924085048779000">Nije dozvoljeno da polje za pristupnu frazu bude prazno.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 3460b90..02fe3e7 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Управљај</translation> <translation id="3816482573645936981">Вредност (замењена)</translation> <translation id="382518646247711829">Ако користите прокси сервер...</translation> +<translation id="3826050100957962900">Пријављивање треће стране</translation> <translation id="3827112369919217609">Апсолут</translation> <translation id="3827666161959873541">Породични филмови</translation> <translation id="3828924085048779000">Није дозвољено да поље за приступну фразу буде празно.</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 17976ae..5838db4 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Hantera</translation> <translation id="3816482573645936981">Värde (ersatt)</translation> <translation id="382518646247711829">Om du använder en proxyserver ...</translation> +<translation id="3826050100957962900">Inloggning hos tredje part</translation> <translation id="3827112369919217609">Absolut</translation> <translation id="3827666161959873541">Familjefilmer</translation> <translation id="3828924085048779000">Lösenfrasen får inte vara tom.</translation> @@ -1333,6 +1334,7 @@ <translation id="4607603470419975064">Knappen Visa tips om Chrome: tryck på Retur om du vill läsa mer om funktioner i Chrome</translation> <translation id="4607608436550361748">Visa tips om Chrome</translation> <translation id="4617273035598175554">Grafik- och animationsprogramvara</translation> +<translation id="4627165777145349100">Mer om den här sidan</translation> <translation id="4627675673814409125">Den här policyn kan inte ställas in på Chrome-profilnivå och kommer att ignoreras.</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4631649115723685955">Cashback länkad</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 64cc0e7..3ff65b5 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -1054,6 +1054,7 @@ <translation id="3810973564298564668">Dhibiti</translation> <translation id="3816482573645936981">Thamani (nafasi yake imechukuliwa)</translation> <translation id="382518646247711829">Ukitumia seva mbadala...</translation> +<translation id="3826050100957962900">Kuingia katika akaunti kwenye huduma nyingine</translation> <translation id="3827112369919217609">Kamili</translation> <translation id="3827666161959873541">Filamu za familia</translation> <translation id="3828924085048779000">Kaulisiri tupu hairuhusiwi.</translation> @@ -1332,6 +1333,7 @@ <translation id="4607603470419975064">Kitufe cha kuona vidokezo vya Chrome, bonyeza 'Enter' ili upate maelezo kuhusu vipengele vya Chrome</translation> <translation id="4607608436550361748">Angalia vidokezo vya Chrome</translation> <translation id="4617273035598175554">Programu ya michoro na uhuishaji</translation> +<translation id="4627165777145349100">Maelezo zaidi kuhusu ukurasa huu</translation> <translation id="4627675673814409125">Sera hii haiwezi kuwekwa katika kiwango cha wasifu wa Chrome na itapuuzwa.</translation> <translation id="4628948037717959914">Picha</translation> <translation id="4631649115723685955">Inajumuisha tuzo ya pesa</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 9d2859b..ed23b4938 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">நிர்வகி</translation> <translation id="3816482573645936981">மதிப்பு (மாற்றியமைக்கப்பட்டது)</translation> <translation id="382518646247711829">நீங்கள் பிராக்சி சர்வரைப் பயன்படுத்தினால்....</translation> +<translation id="3826050100957962900">மூன்றாம் தரப்பு உள்நுழைவு</translation> <translation id="3827112369919217609">துல்லியமானது</translation> <translation id="3827666161959873541">குடும்பம் சார்ந்த திரைப்படங்கள்</translation> <translation id="3828924085048779000">வெற்று கடவுச்சொற்றொடருக்கு அனுமதியில்லை.</translation> @@ -1060,6 +1061,7 @@ <translation id="3835233591525155343">உங்கள் சாதன உபயோகம்</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, புதிய Google ஆவணத்தை விரைவாக உருவாக்க Tab பட்டனை அழுத்திவிட்டு Enter பட்டனை அழுத்துங்கள்</translation> <translation id="385051799172605136">திரும்பு</translation> +<translation id="3851515670389017037">’குறிப்பிட்ட தேடல் விவரங்கள்’ மூடப்பட்டுள்ளன</translation> <translation id="3858027520442213535">தேதியையும் நேரத்தையும் புதுப்பி</translation> <translation id="3858860766373142691">பெயர்</translation> <translation id="3872834068356954457">அறிவியல்</translation> @@ -1360,6 +1362,7 @@ <translation id="470284880436071933">குற்றம் & நீதி</translation> <translation id="4704732901923281920">உயிரியல் அறிவியல்</translation> <translation id="4708268264240856090">உங்கள் இணைப்பில் தடங்கல் ஏற்பட்டது</translation> +<translation id="4709819737903924300">’குறிப்பிட்ட தேடல் விவரங்கள்’ முழுத் திரையில் காட்டப்படுகின்றன</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows நெட்வொர்க் டயக்னாஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" /> இன் கடவுச்சொல்</translation> @@ -1823,6 +1826,7 @@ <translation id="5989320800837274978">ப்ராக்ஸி சேவையகம் சரிசெய்யப்படவும் இல்லை .pac ஸ்கிரிப்ட் URL குறிப்பிடப்படவுமில்லை.</translation> <translation id="5992691462791905444">இன்ஜினியரிங் Z-ஃபோல்டு</translation> <translation id="5995727681868049093">உங்கள் Google கணக்கில் உள்ள தகவல்கள், தனியுரிமை, பாதுகாப்பு ஆகியவற்றை நிர்வகிக்கலாம்</translation> +<translation id="5997247540087773573">நீங்கள் தற்போது பயன்படுத்திய கடவுச்சொல், தரவு மீறலுக்கு உள்ளாகியிருப்பதாகக் கண்டறியப்பட்டுள்ளது. உங்கள் கணக்குகளைப் பாதுகாப்பாக வைத்திருக்க, இப்போதே கடவுச்சொல்லை மாற்றும்படியும் சேமித்த கடவுச்சொற்களைச் சரிபார்க்கும்படியும் Google Password Manager பரிந்துரைக்கிறது.</translation> <translation id="6000758707621254961">'<ph name="SEARCH_TEXT" />'க்கு <ph name="RESULT_COUNT" /> முடிவுகள் உள்ளன</translation> <translation id="6006484371116297560">கிளாசிக்</translation> <translation id="6008122969617370890">பின்னோக்கிய வரிசை</translation> @@ -1861,6 +1865,7 @@ <translation id="6061154937977953833">மல்யுத்தம்</translation> <translation id="6064217302520318294">திரைப் பூட்டு</translation> <translation id="6064602040258638498">கூப்பன்கள் & தள்ளுபடிச் சலுகைகள்</translation> +<translation id="6078813287646374487">இந்தப் பக்கத்தைக் குறித்து மேலும் தகவல்களைக் காட்டும்</translation> <translation id="6080696365213338172">நிர்வாகி வழங்கிய சான்றிதழைப் பயன்படுத்தி உள்ளடக்கத்தை அணுகியுள்ளீர்கள். <ph name="DOMAIN" /> க்கு நீங்கள் வழங்கிய தரவானது உங்கள் நிர்வாகியால் இடைமறிக்கப்படலாம்.</translation> <translation id="6087312102907839798">தொடர்புடைய தேடல்கள்</translation> <translation id="6094273045989040137">விரிவுரைப் பயன்முறை</translation> @@ -2598,6 +2603,7 @@ <translation id="8163866351304776260">குவாட் பஞ்ச் லெஃப்ட்</translation> <translation id="8175796834047840627">உங்கள் Google கணக்கில் உள்நுழைந்திருப்பதால் Chrome உங்கள் கார்டுகளை இந்தக் கணக்கில் சேமிப்பதற்குக் கோருகிறது. இதை அமைப்புகளில் மாற்றலாம்.</translation> <translation id="8176440868214972690">அமைப்புகள், கொள்கைகள் போன்ற சில தகவல்களை இந்தச் சாதனத்தின் நிர்வாகி பின்வரும் இணையதளங்களுக்கு அனுப்பியுள்ளார்.</translation> +<translation id="8179003511148538426">’குறிப்பிட்ட தேடல் விவரங்கள்’ பாதித் திரையில் காட்டப்படுகின்றன</translation> <translation id="8184538546369750125">முழுமையான இயல்புநிலையைப் பயன்படுத்து (அனுமதி)</translation> <translation id="8186706823560132848">மென்பொருள்</translation> <translation id="8190193880870196235">நீட்டிப்பு மூலம் நிர்வகிக்கப்படுகிறது</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 6c79263..1642cc3 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -1057,6 +1057,7 @@ <translation id="3810973564298564668">నిర్వహించు</translation> <translation id="3816482573645936981">విలువ (అధిగమించబడింది)</translation> <translation id="382518646247711829">మీరు ప్రాక్సీ సర్వర్ను ఉపయోగిస్తే...</translation> +<translation id="3826050100957962900">థర్డ్-పార్టీ సైన్ ఇన్</translation> <translation id="3827112369919217609">అబ్సల్యూట్</translation> <translation id="3827666161959873541">కుటుంబ తరహా సినిమాలు</translation> <translation id="3828924085048779000">ఖాళీ రహస్య పదబంధం అనుమతించబడదు.</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index a6ab76a..61f5b275 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -1050,6 +1050,7 @@ <translation id="3810973564298564668">จัดการ</translation> <translation id="3816482573645936981">ค่า (ถูกแทนที่)</translation> <translation id="382518646247711829">หากคุณใช้พร็อกซีเซิร์ฟเวอร์...</translation> +<translation id="3826050100957962900">การลงชื่อเข้าใช้ของบุคคลที่สาม</translation> <translation id="3827112369919217609">Absolute</translation> <translation id="3827666161959873541">ภาพยนตร์ครอบครัว</translation> <translation id="3828924085048779000">ข้อความรหัสผ่านต้องไม่เว้นว่างไว้</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 205b488..45a2789 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -1052,6 +1052,7 @@ <translation id="3810973564298564668">Yönet</translation> <translation id="3816482573645936981">Değer (geçersiz kılındı)</translation> <translation id="382518646247711829">Proxy sunucu kullanıyorsanız...</translation> +<translation id="3826050100957962900">Üçüncü taraf oturum açma</translation> <translation id="3827112369919217609">Mutlak</translation> <translation id="3827666161959873541">Aile filmleri</translation> <translation id="3828924085048779000">Boş parolaya izin verilmez.</translation> @@ -1061,6 +1062,7 @@ <translation id="3835233591525155343">Cihaz kullanımınız</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, hızlıca yeni bir Google Dokümanı oluşturmak için Sekme'ye, ardından Enter'a basın</translation> <translation id="385051799172605136">Geri</translation> +<translation id="3851515670389017037">Arama yolculukları kapatıldı</translation> <translation id="3858027520442213535">Tarih ve saati güncelle</translation> <translation id="3858860766373142691">Ad</translation> <translation id="3872834068356954457">Bilim</translation> @@ -1357,6 +1359,7 @@ <translation id="470284880436071933">Suç ve adalet</translation> <translation id="4704732901923281920">Biyoloji</translation> <translation id="4708268264240856090">Bağlantınız kesildi</translation> +<translation id="4709819737903924300">Arama yolculukları tam ekranda açıldı</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows Ağ Teşhislerini Çalıştırma<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" /> için şifre</translation> @@ -1820,6 +1823,7 @@ <translation id="5989320800837274978">Sabit proxy sunucular veya bir .pac komut dosyası URL'si belirtilmedi.</translation> <translation id="5992691462791905444">Yarım Z katlama</translation> <translation id="5995727681868049093">Google Hesabınızda bilgilerinizi, gizliliğinizi ve güvenliğinizi yönetin</translation> +<translation id="5997247540087773573">Az önce kullandığınız şifrenin bir veri ihlali sonucunda açığa çıktığı anlaşıldı. Google Şifre Yöneticisi, hesaplarınızın güvenliğini sağlamak için bu şifreyi hemen değiştirmenizi ve kayıtlı şifrelerinizi kontrol etmenizi öneriyor.</translation> <translation id="6000758707621254961">"<ph name="SEARCH_TEXT" />" için bulunan <ph name="RESULT_COUNT" /> sonuç gösteriliyor</translation> <translation id="6006484371116297560">Klasik</translation> <translation id="6008122969617370890">N'den 1'e sıralı</translation> @@ -1858,6 +1862,7 @@ <translation id="6061154937977953833">Güreş</translation> <translation id="6064217302520318294">Ekran kilidi</translation> <translation id="6064602040258638498">Kuponlar ve indirim teklifleri</translation> +<translation id="6078813287646374487">Bu sayfayla ilgili daha fazla bilgi göster</translation> <translation id="6080696365213338172">Yönetici tarafından sağlanmış bir sertifika kullanan içeriğe eriştiniz. <ph name="DOMAIN" /> alan adına sağladığınız verileri yöneticiniz görebilir ve bunlara müdahale edebilir.</translation> <translation id="6087312102907839798">İlgili aramalar</translation> <translation id="6094273045989040137">Ek açıklama ekle</translation> @@ -2596,6 +2601,7 @@ <translation id="8163866351304776260">Solda dörtlü delik</translation> <translation id="8175796834047840627">Chrome, oturumunuz açık olduğu için kartlarınızı Google Hesabınıza kaydetmeyi öneriyor. Bu davranışı ayarlardan değiştirebilirsiniz.</translation> <translation id="8176440868214972690">Bu cihazın yöneticisi, aşağıdaki web sitelerine ayarlar ve politikalar gibi bazı bilgiler gönderdi.</translation> +<translation id="8179003511148538426">Arama yolculukları ekranın yarısına kadar açıldı</translation> <translation id="8184538546369750125">Genel varsayılanı kullan (İzin ver)</translation> <translation id="8186706823560132848">Yazılım</translation> <translation id="8190193880870196235">Bir uzantı tarafından yönetiliyor</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 9d79753..59724481 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Керувати</translation> <translation id="3816482573645936981">Значення (замінено)</translation> <translation id="382518646247711829">Якщо ви використовуєте проксі-сервер…</translation> +<translation id="3826050100957962900">Вхід через сторонні сервіси</translation> <translation id="3827112369919217609">Абсолютна</translation> <translation id="3827666161959873541">Сімейні фільми</translation> <translation id="3828924085048779000">Порожня парольна фраза заборонена.</translation> @@ -1064,6 +1065,7 @@ <translation id="3835233591525155343">Дані про активний стан пристрою</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />; натисніть Tab, а потім – Enter, щоб швидко створити новий документ Google</translation> <translation id="385051799172605136">Назад</translation> +<translation id="3851515670389017037">Сеанси закрито</translation> <translation id="3858027520442213535">Оновити дату й час</translation> <translation id="3858860766373142691">Назва</translation> <translation id="3872834068356954457">Наука</translation> @@ -1364,6 +1366,7 @@ <translation id="470284880436071933">Злочин і правосуддя</translation> <translation id="4704732901923281920">Біологічні науки</translation> <translation id="4708268264240856090">З’єднання розірвано</translation> +<translation id="4709819737903924300">Сеанси відкрито на всю висоту</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />провести діагностику мережі Windows<ph name="END_LINK" /></translation> <translation id="4722735765955348426">Пароль користувача <ph name="USERNAME" /></translation> @@ -1827,6 +1830,7 @@ <translation id="5989320800837274978">Не вказано ні фіксованих проксі-серверів, ні URL-адрес сценарію .pac.</translation> <translation id="5992691462791905444">Зігнути гармошкою</translation> <translation id="5995727681868049093">Керуйте своєю інформацією, конфіденційністю й безпекою в обліковому записі Google</translation> +<translation id="5997247540087773573">Введений пароль розкрито через порушення безпеки даних. Щоб захистити ваші облікові записи, Менеджер паролів Google радить негайно його змінити й перевірити збережені паролі.</translation> <translation id="6000758707621254961">Результатів для запиту "<ph name="SEARCH_TEXT" />": <ph name="RESULT_COUNT" /></translation> <translation id="6006484371116297560">Класична</translation> <translation id="6008122969617370890">Порядок від N до 1</translation> @@ -1865,6 +1869,7 @@ <translation id="6061154937977953833">Боротьба</translation> <translation id="6064217302520318294">Блокування екрана</translation> <translation id="6064602040258638498">Купони та дисконтні пропозиції</translation> +<translation id="6078813287646374487">Показати більше інформації про цю сторінку</translation> <translation id="6080696365213338172">Ви отримали доступ до вмісту, використовуючи наданий адміністратором сертифікат. Адміністратор може перехоплювати дані, які ви надасте домену <ph name="DOMAIN" />.</translation> <translation id="6087312102907839798">Пов’язані пошукові запити</translation> <translation id="6094273045989040137">Додати примітку</translation> @@ -2603,6 +2608,7 @@ <translation id="8163866351304776260">Пробити чотири отвори ліворуч</translation> <translation id="8175796834047840627">Chrome пропонує вам зберегти картки в обліковому записі Google, оскільки ви ввійшли в нього. Це можна змінити в налаштуваннях.</translation> <translation id="8176440868214972690">Адміністратор пристрою надіслав указаним веб-сайтам деяку інформацію, таку як налаштування й правила.</translation> +<translation id="8179003511148538426">Сеанси відкрито на половину висоти</translation> <translation id="8184538546369750125">Використовувати глобальне налаштування за умовчанням (Дозволяти)</translation> <translation id="8186706823560132848">Програмне забезпечення</translation> <translation id="8190193880870196235">Дозволом керує розширення</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index c2e2c002..e290ee9 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -1057,6 +1057,7 @@ <translation id="3810973564298564668">نظم کریں</translation> <translation id="3816482573645936981">قدر (اس کی جگہ نافذ کردہ)</translation> <translation id="382518646247711829">اگر آپ ایک پراکسی سرور استعمال کرتے ہیں تو…</translation> +<translation id="3826050100957962900">فریق ثالث سائن ان</translation> <translation id="3827112369919217609">یقینی</translation> <translation id="3827666161959873541">خاندان پر مبنی فلمیں</translation> <translation id="3828924085048779000">خالی پاس فریز کی اجازت نہیں ہے۔</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 9753c580..e3ef9c0 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -1050,6 +1050,7 @@ <translation id="3810973564298564668">Sozlash</translation> <translation id="3816482573645936981">Qiymat (almashtirildi)</translation> <translation id="382518646247711829">Agar proksi-server ishlatsangiz...</translation> +<translation id="3826050100957962900">Tashqi xizmatga kirish</translation> <translation id="3827112369919217609">Mutlaq</translation> <translation id="3827666161959873541">Oilaviy filmlar</translation> <translation id="3828924085048779000">Parol jumlasini bo‘sh qoldirib bo‘lmaydi.</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 5a839ca..4e8208e3 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -1055,6 +1055,7 @@ <translation id="3810973564298564668">Quản lý</translation> <translation id="3816482573645936981">Giá trị (đã thay thế)</translation> <translation id="382518646247711829">Nếu bạn sử dụng máy chủ proxy...</translation> +<translation id="3826050100957962900">Đăng nhập qua bên thứ ba</translation> <translation id="3827112369919217609">Tuyệt đối</translation> <translation id="3827666161959873541">Phim gia đình</translation> <translation id="3828924085048779000">Không cho phép cụm mật khẩu trống.</translation> @@ -1333,6 +1334,7 @@ <translation id="4607603470419975064">Nút xem các mẹo khi dùng Chrome, nhấn phím Enter để tìm hiểu về các tính năng của Chrome</translation> <translation id="4607608436550361748">Xem các mẹo khi dùng Chrome</translation> <translation id="4617273035598175554">Phần mềm hoạt hình và đồ hoạ</translation> +<translation id="4627165777145349100">Xem thêm về trang này</translation> <translation id="4627675673814409125">Bạn không thể đặt chính sách ở cấp hồ sơ trên Chrome và hệ thống sẽ bỏ qua chính sách này.</translation> <translation id="4628948037717959914">Ảnh</translation> <translation id="4631649115723685955">Đã liên kết ưu đãi hoàn tiền</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 0c50c3e..5be8142 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -1047,6 +1047,7 @@ <translation id="3810973564298564668">管理</translation> <translation id="3816482573645936981">值(已被取代)</translation> <translation id="382518646247711829">如果您使用代理服务器…</translation> +<translation id="3826050100957962900">第三方登录</translation> <translation id="3827112369919217609">绝对</translation> <translation id="3827666161959873541">面向家庭的影片</translation> <translation id="3828924085048779000">密码输入字段不能留空。</translation> @@ -1056,6 +1057,7 @@ <translation id="3835233591525155343">您的设备使用情况</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />,依次按 Tab 键和 Enter 键即可快速创建新的 Google 文档</translation> <translation id="385051799172605136">返回</translation> +<translation id="3851515670389017037">“历程”工作表已关闭</translation> <translation id="3858027520442213535">更新日期和时间</translation> <translation id="3858860766373142691">名称</translation> <translation id="3872834068356954457">科学</translation> @@ -1320,6 +1322,7 @@ <translation id="4607603470419975064">“查看 Chrome 提示”按钮,按 Enter 键即可了解各项 Chrome 功能</translation> <translation id="4607608436550361748">查看 Chrome 提示</translation> <translation id="4617273035598175554">图形与动画软件</translation> +<translation id="4627165777145349100">详细了解此页面</translation> <translation id="4627675673814409125">此政策无法在 Chrome 个人资料级别设置,因而会被忽略。</translation> <translation id="4628948037717959914">照片</translation> <translation id="4631649115723685955">已关联返现</translation> @@ -1350,6 +1353,7 @@ <translation id="470284880436071933">犯罪与司法</translation> <translation id="4704732901923281920">生物科学</translation> <translation id="4708268264240856090">您的连接已中断</translation> +<translation id="4709819737903924300">“历程”工作表已全屏打开</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />运行 Windows 网络诊断<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" /> 的密码</translation> @@ -1813,6 +1817,7 @@ <translation id="5989320800837274978">固定代理服务器和 .pac 脚本网址均未指定。</translation> <translation id="5992691462791905444">工程 Z 型折</translation> <translation id="5995727681868049093">在您的 Google 帐号中管理自己的信息、隐私和安全</translation> +<translation id="5997247540087773573">您刚才使用的密码遭遇了数据泄露。为确保您的帐号安全,Google 密码管理工具建议您立即更改此密码并检查您已保存的所有密码。</translation> <translation id="6000758707621254961"><ph name="RESULT_COUNT" /> 个与“<ph name="SEARCH_TEXT" />”相符的搜索结果</translation> <translation id="6006484371116297560">经典</translation> <translation id="6008122969617370890">从 N 到 1 的顺序</translation> @@ -1851,6 +1856,7 @@ <translation id="6061154937977953833">摔跤</translation> <translation id="6064217302520318294">屏幕锁定</translation> <translation id="6064602040258638498">优惠券与折扣优惠</translation> +<translation id="6078813287646374487">显示此页面的更多相关信息</translation> <translation id="6080696365213338172">您已使用管理员提供的证书访问了内容,因此管理员可以拦截您提供给 <ph name="DOMAIN" /> 的数据。</translation> <translation id="6087312102907839798">相关搜索</translation> <translation id="6094273045989040137">注释</translation> @@ -2588,6 +2594,7 @@ <translation id="8163866351304776260">四孔(左侧)</translation> <translation id="8175796834047840627">Chrome 会主动询问是否要将您的卡保存到您的 Google 帐号中,因为您已登录。您可在“设置”中更改此行为。</translation> <translation id="8176440868214972690">此设备的管理员已将某些信息(例如设置或政策)发送给下列网站。</translation> +<translation id="8179003511148538426">“历程”工作表已半屏打开</translation> <translation id="8184538546369750125">使用全局默认设置(允许)</translation> <translation id="8186706823560132848">软件</translation> <translation id="8190193880870196235">由一款扩展程序管理</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 428a3b4..a3f3410b 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -1050,6 +1050,7 @@ <translation id="3810973564298564668">管理</translation> <translation id="3816482573645936981">值 (已被取代)</translation> <translation id="382518646247711829">如果您使用 Proxy 伺服器…</translation> +<translation id="3826050100957962900">第三方登入</translation> <translation id="3827112369919217609">絕對</translation> <translation id="3827666161959873541">家庭電影</translation> <translation id="3828924085048779000">複雜密碼欄位不得留空。</translation> @@ -1059,6 +1060,7 @@ <translation id="3835233591525155343">您的裝置使用狀態</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />,㩒一下 Tab 鍵,然後㩒一下 Enter 鍵就可以快速建立新嘅 Google 文件</translation> <translation id="385051799172605136">返回</translation> +<translation id="3851515670389017037">閂咗瀏覽過程</translation> <translation id="3858027520442213535">更新日期和時間</translation> <translation id="3858860766373142691">名稱</translation> <translation id="3872834068356954457">科學</translation> @@ -1354,6 +1356,7 @@ <translation id="470284880436071933">犯罪和司法</translation> <translation id="4704732901923281920">生物科學</translation> <translation id="4708268264240856090">您的連線已中斷</translation> +<translation id="4709819737903924300">瀏覽過程宜家顯示喺成個畫面</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />執行 Windows 網絡診斷<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" />的密碼</translation> @@ -1817,6 +1820,7 @@ <translation id="5989320800837274978">沒有指定固定的 Proxy 伺服器和 .pac 指令碼網址。</translation> <translation id="5992691462791905444">大小風琴摺</translation> <translation id="5995727681868049093">在 Google 帳戶管理您的資料、私隱權和安全設定</translation> +<translation id="5997247540087773573">系統發現您剛才使用的密碼因資料外洩而被洩露。為確保帳戶安全,「Google 密碼管理工具」建議您立即變更密碼,並檢查已儲存的密碼。</translation> <translation id="6000758707621254961">有 <ph name="RESULT_COUNT" /> 個同「<ph name="SEARCH_TEXT" />」相關嘅搜尋結果</translation> <translation id="6006484371116297560">經典主題</translation> <translation id="6008122969617370890">N 至 1 的順序</translation> @@ -1855,6 +1859,7 @@ <translation id="6061154937977953833">摔角</translation> <translation id="6064217302520318294">螢幕鎖定</translation> <translation id="6064602040258638498">優惠券和折扣</translation> +<translation id="6078813287646374487">顯示更多關於此頁面的資料</translation> <translation id="6080696365213338172">您使用了管理員提供的憑證存取內容,因此管理員可攔截您傳送至「<ph name="DOMAIN" />」的數據。</translation> <translation id="6087312102907839798">相關搜尋</translation> <translation id="6094273045989040137">加入註釋</translation> @@ -2593,6 +2598,7 @@ <translation id="8163866351304776260">四孔 (左側)</translation> <translation id="8175796834047840627">由於您已登入,因此 Chrome 提議將您的付款卡儲存至 Google 帳戶。您可以在設定中變更此行為。</translation> <translation id="8176440868214972690">此裝置的管理員已將一些資訊 (例如設定或政策) 傳送到以下網站。</translation> +<translation id="8179003511148538426">瀏覽過程宜家顯示喺畫面下半部</translation> <translation id="8184538546369750125">使用全域預設值 (允許)</translation> <translation id="8186706823560132848">軟件</translation> <translation id="8190193880870196235">由擴充程式管理</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 09745fd..00893cd 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -1051,6 +1051,7 @@ <translation id="3810973564298564668">管理</translation> <translation id="3816482573645936981">值 (已被取代)</translation> <translation id="382518646247711829">如果你使用 Proxy 伺服器...</translation> +<translation id="3826050100957962900">第三方登入</translation> <translation id="3827112369919217609">絕對</translation> <translation id="3827666161959873541">家庭電影</translation> <translation id="3828924085048779000">通關密語欄位不得留空。</translation> @@ -1060,6 +1061,7 @@ <translation id="3835233591525155343">你的裝置使用狀態</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />;按下 Tab 鍵再按下 Enter 鍵即可快速建立新的 Google 文件</translation> <translation id="385051799172605136">返回</translation> +<translation id="3851515670389017037">瀏覽歷程已關閉</translation> <translation id="3858027520442213535">更新日期和時間</translation> <translation id="3858860766373142691">名稱</translation> <translation id="3872834068356954457">科學</translation> @@ -1324,6 +1326,7 @@ <translation id="4607603470419975064">查看 Chrome 提示的按鈕;按下 Enter 鍵即可瞭解 Chrome 功能</translation> <translation id="4607608436550361748">查看 Chrome 提示</translation> <translation id="4617273035598175554">繪圖與動畫軟體</translation> +<translation id="4627165777145349100">進一步瞭解這個頁面</translation> <translation id="4627675673814409125">這項政策無法在 Chrome 設定檔層級設定,因此將遭到忽略。</translation> <translation id="4628948037717959914">相片</translation> <translation id="4631649115723685955">已連結現金回饋</translation> @@ -1354,6 +1357,7 @@ <translation id="470284880436071933">犯罪與審判</translation> <translation id="4704732901923281920">生物科學</translation> <translation id="4708268264240856090">您的連線已中斷</translation> +<translation id="4709819737903924300">瀏覽歷程已開啟,顯示於整個畫面</translation> <translation id="4712404868219726379">Windows Hello</translation> <translation id="4722547256916164131"><ph name="BEGIN_LINK" />執行 Windows 網路診斷<ph name="END_LINK" /></translation> <translation id="4722735765955348426"><ph name="USERNAME" />的密碼</translation> @@ -1817,6 +1821,7 @@ <translation id="5989320800837274978">沒有指定固定的 Proxy 伺服器和 .pac 指令碼網址。</translation> <translation id="5992691462791905444">大小彈簧摺</translation> <translation id="5995727681868049093">管理 Google 帳戶的資訊、隱私權和安全性</translation> +<translation id="5997247540087773573">你剛才使用的密碼已在資料侵害事件中遭到外洩。為確保帳戶安全,Google 密碼管理員建議你立即變更這組密碼,並檢查已儲存的密碼。</translation> <translation id="6000758707621254961">有 <ph name="RESULT_COUNT" /> 個與「<ph name="SEARCH_TEXT" />」相符的搜尋結果</translation> <translation id="6006484371116297560">傳統版</translation> <translation id="6008122969617370890">N 到 1 的順序</translation> @@ -1855,6 +1860,7 @@ <translation id="6061154937977953833">摔角</translation> <translation id="6064217302520318294">螢幕鎖定</translation> <translation id="6064602040258638498">優待券與折扣優惠</translation> +<translation id="6078813287646374487">顯示更多有關這個頁面的資訊</translation> <translation id="6080696365213338172">你使用了管理員提供的憑證存取內容,因此管理員可攔截你傳送至「<ph name="DOMAIN" />」的資料。</translation> <translation id="6087312102907839798">相關搜尋</translation> <translation id="6094273045989040137">註解</translation> @@ -2593,6 +2599,7 @@ <translation id="8163866351304776260">四孔 (左側)</translation> <translation id="8175796834047840627">你已登入帳戶,因此 Chrome 詢問你是否要將卡片儲存至你的 Google 帳戶。你可以在設定中變更這項行為。</translation> <translation id="8176440868214972690">這部裝置的管理員已將一些資訊 (例如設定或政策) 傳送到下列網站。</translation> +<translation id="8179003511148538426">瀏覽歷程已開啟,顯示於畫面下半部</translation> <translation id="8184538546369750125">使用全域預設值 (允許)</translation> <translation id="8186706823560132848">軟體</translation> <translation id="8190193880870196235">由擴充功能管理</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 99cdf4001..2f084de0 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -1052,6 +1052,7 @@ <translation id="3810973564298564668">Phatha</translation> <translation id="3816482573645936981">Inani (lithathelwe isikhundla)</translation> <translation id="382518646247711829">Uma ngabe usebenzisa iseva elibamba...</translation> +<translation id="3826050100957962900">Ukungena ngemvume kwenkampani yangaphandle</translation> <translation id="3827112369919217609">Okuphelele</translation> <translation id="3827666161959873541">Awama-movie womndeni</translation> <translation id="3828924085048779000">Umushwana wokungena ongenalutho awuvunyelwe.</translation>
diff --git a/components/sync/driver/sync_service_impl.cc b/components/sync/driver/sync_service_impl.cc index 8ca5146..3fe9ade 100644 --- a/components/sync/driver/sync_service_impl.cc +++ b/components/sync/driver/sync_service_impl.cc
@@ -1187,6 +1187,14 @@ UserSelectableTypeToCanonicalModelType(type)); base::UmaHistogramEnumeration("Sync.CustomSync3", canonical_model_type); } +#if BUILDFLAG(IS_CHROMEOS_ASH) + for (UserSelectableOsType type : user_settings_->GetSelectedOsTypes()) { + ModelTypeForHistograms canonical_model_type = ModelTypeHistogramValue( + UserSelectableOsTypeToCanonicalModelType(type)); + base::UmaHistogramEnumeration("Sync.CustomOSSync", + canonical_model_type); + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) } } }
diff --git a/components/sync/engine/syncer_proto_util.cc b/components/sync/engine/syncer_proto_util.cc index adf7054..882ca4d7 100644 --- a/components/sync/engine/syncer_proto_util.cc +++ b/components/sync/engine/syncer_proto_util.cc
@@ -280,6 +280,9 @@ if (IsSyncDisabledByAdmin(response)) { sync_protocol_error.error_type = DISABLED_BY_ADMIN; sync_protocol_error.action = STOP_SYNC_FOR_DISABLED_ACCOUNT; + } else if (response.has_error()) { + // If the server provides explicit error information, just honor it. + sync_protocol_error = ConvertErrorPBToSyncProtocolError(response.error()); } else if (!ProcessResponseBirthday(response, context)) { // If sync isn't disabled, first check for a birthday mismatch error. if (response.error_code() == sync_pb::SyncEnums::CLIENT_DATA_OBSOLETE) { @@ -290,9 +293,6 @@ sync_protocol_error.error_type = NOT_MY_BIRTHDAY; sync_protocol_error.action = DISABLE_SYNC_ON_CLIENT; } - } else if (response.has_error()) { - // This is a new server. Just get the error from the protocol. - sync_protocol_error = ConvertErrorPBToSyncProtocolError(response.error()); } else { // Legacy server implementation. Compute the error based on |error_code|. sync_protocol_error = ErrorCodeToSyncProtocolError(response.error_code());
diff --git a/components/sync/engine/syncer_proto_util_unittest.cc b/components/sync/engine/syncer_proto_util_unittest.cc index 8ae29a7c..5a45ade 100644 --- a/components/sync/engine/syncer_proto_util_unittest.cc +++ b/components/sync/engine/syncer_proto_util_unittest.cc
@@ -148,6 +148,21 @@ EXPECT_EQ(STOP_SYNC_FOR_DISABLED_ACCOUNT, sync_protocol_error.action); } +TEST_F(SyncerProtoUtilTest, VerifyUpgradeClient) { + ASSERT_TRUE(context()->birthday().empty()); + sync_pb::ClientToServerResponse response; + response.set_error_code(sync_pb::SyncEnums::SUCCESS); + response.mutable_error()->set_error_type(sync_pb::SyncEnums::THROTTLED); + response.mutable_error()->set_action(sync_pb::SyncEnums::UPGRADE_CLIENT); + response.mutable_error()->set_error_description( + "Legacy client needs to be upgraded."); + + SyncProtocolError sync_protocol_error = + CallGetProtocolErrorFromResponse(response, context()); + EXPECT_EQ(THROTTLED, sync_protocol_error.error_type); + EXPECT_EQ(UPGRADE_CLIENT, sync_protocol_error.action); +} + TEST_F(SyncerProtoUtilTest, VerifyEncryptionObsolete) { sync_pb::ClientToServerResponse response; response.set_error_code(sync_pb::SyncEnums::ENCRYPTION_OBSOLETE);
diff --git a/components/sync/nigori/nigori_model_type_processor.cc b/components/sync/nigori/nigori_model_type_processor.cc index 0b8c8058..8fb08a5 100644 --- a/components/sync/nigori/nigori_model_type_processor.cc +++ b/components/sync/nigori/nigori_model_type_processor.cc
@@ -268,7 +268,8 @@ root_node->SetStringKey("modelType", ModelTypeToDebugString(NIGORI)); auto all_nodes = std::make_unique<base::ListValue>(); - all_nodes->Append(std::move(root_node)); + all_nodes->GetList().Append( + base::Value::FromUniquePtrValue(std::move(root_node))); std::move(callback).Run(syncer::NIGORI, std::move(all_nodes)); }
diff --git a/components/sync/test/fake_server/fake_server.cc b/components/sync/test/fake_server/fake_server.cc index ebb4935..b22b2c19 100644 --- a/components/sync/test/fake_server/fake_server.cc +++ b/components/sync/test/fake_server/fake_server.cc
@@ -269,20 +269,17 @@ commit_error_type_ != sync_pb::SyncEnums::SUCCESS && ShouldSendTriggeredError()) { response->set_error_code(commit_error_type_); - response->set_store_birthday(loopback_server_->GetStoreBirthday()); return net::HTTP_OK; } if (error_type_ != sync_pb::SyncEnums::SUCCESS && ShouldSendTriggeredError()) { response->set_error_code(error_type_); - response->set_store_birthday(loopback_server_->GetStoreBirthday()); return net::HTTP_OK; } if (triggered_actionable_error_.get() && ShouldSendTriggeredError()) { *response->mutable_error() = *triggered_actionable_error_; - response->set_store_birthday(loopback_server_->GetStoreBirthday()); return net::HTTP_OK; } @@ -515,8 +512,15 @@ void FakeServer::ClearServerData() { DCHECK(thread_checker_.CalledOnValidThread()); - base::ScopedAllowBlockingForTesting allow_blocking; - loopback_server_->ClearServerData(); + + { + base::ScopedAllowBlockingForTesting allow_blocking; + loopback_server_->ClearServerData(); + } + + // Notify observers so invalidations are mimic-ed. + OnCommit(/*committer_invalidator_client_id=*/std::string(), + /*committed_model_types=*/{syncer::NIGORI}); } void FakeServer::SetHttpError(net::HttpStatusCode http_status_code) {
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2Api.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2Api.java index c0b76ae5..36cc75e0 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2Api.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2Api.java
@@ -308,12 +308,12 @@ */ public static void appendBrowserGetAssertionOptionsToParcel( PublicKeyCredentialRequestOptions options, Uri origin, byte[] clientDataHash, - Parcel parcel) { + byte[] tunnelId, Parcel parcel) { final int a = writeHeader(OBJECT_MAGIC, parcel); // 2: PublicKeyCredentialRequestOptions int z = writeHeader(2, parcel); - appendGetAssertionOptionsToParcel(options, parcel); + appendGetAssertionOptionsToParcel(options, tunnelId, parcel); writeLength(z, parcel); // 3: origin @@ -338,7 +338,7 @@ * @param parcel the {@link Parcel} to append the output to. */ public static void appendGetAssertionOptionsToParcel( - PublicKeyCredentialRequestOptions options, Parcel parcel) { + PublicKeyCredentialRequestOptions options, byte[] tunnelId, Parcel parcel) { final int a = writeHeader(OBJECT_MAGIC, parcel); // 2: challenge @@ -372,14 +372,14 @@ // 9: extensions z = writeHeader(9, parcel); - appendGetAssertionExtensionsToParcel(options, parcel); + appendGetAssertionExtensionsToParcel(options, tunnelId, parcel); writeLength(z, parcel); writeLength(a, parcel); } private static void appendGetAssertionExtensionsToParcel( - PublicKeyCredentialRequestOptions options, Parcel parcel) { + PublicKeyCredentialRequestOptions options, byte[] tunnelId, Parcel parcel) { final int a = writeHeader(OBJECT_MAGIC, parcel); // 2: appId @@ -404,6 +404,16 @@ writeLength(b, parcel); } + if (tunnelId != null) { + final int b = writeHeader(9, parcel); + final int c = writeHeader(OBJECT_MAGIC, parcel); + final int d = writeHeader(1, parcel); + parcel.writeString(Base64.encodeToString(tunnelId, Base64.NO_WRAP)); + writeLength(d, parcel); + writeLength(c, parcel); + writeLength(b, parcel); + } + writeLength(a, parcel); }
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java index 8c8d4f5c..e6adc7d 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java
@@ -290,10 +290,10 @@ args.writeInt(1); // This indicates that the following options are present. if (mSupportLevel == WebAuthenticationDelegate.Support.BROWSER) { - Fido2Api.appendBrowserGetAssertionOptionsToParcel( - options, Uri.parse(callerOriginString), clientDataHash, args); + Fido2Api.appendBrowserGetAssertionOptionsToParcel(options, + Uri.parse(callerOriginString), clientDataHash, /*tunnelId=*/null, args); } else { - Fido2Api.appendGetAssertionOptionsToParcel(options, args); + Fido2Api.appendGetAssertionOptionsToParcel(options, /*tunnelId=*/null, args); } Task<PendingIntent> task = call.run(
diff --git a/content/browser/accessibility/browser_accessibility_fuchsia.cc b/content/browser/accessibility/browser_accessibility_fuchsia.cc index 40c4159..647eb3ac 100644 --- a/content/browser/accessibility/browser_accessibility_fuchsia.cc +++ b/content/browser/accessibility/browser_accessibility_fuchsia.cc
@@ -6,6 +6,7 @@ #include <lib/ui/scenic/cpp/commands.h> +#include "base/fuchsia/fuchsia_logging.h" #include "content/browser/accessibility/browser_accessibility_manager_fuchsia.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_registry.h" @@ -393,7 +394,15 @@ BrowserAccessibilityFuchsia* fuchsia_container = ToBrowserAccessibilityFuchsia(offset_container); - DCHECK(fuchsia_container); + + // TODO(https://crbug.com/1321935): Remove this check once we understand why + // we're getting non-existent offset container IDs from blink. + if (!fuchsia_container) { + ZX_LOG(ERROR, ZX_OK) << "Node " << GetId() + << " references non-existent offset container ID " + << offset_container_id; + return 0; + } return fuchsia_container->GetFuchsiaNodeID(); }
diff --git a/content/browser/accessibility/browser_accessibility_fuchsia_unittest.cc b/content/browser/accessibility/browser_accessibility_fuchsia_unittest.cc index bf40e048..8ba881e3 100644 --- a/content/browser/accessibility/browser_accessibility_fuchsia_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_fuchsia_unittest.cc
@@ -616,6 +616,30 @@ } TEST_F(BrowserAccessibilityFuchsiaTest, + ToleratesNonexistentOffsetContainerNodeID) { + ui::AXNodeData node; + node.id = kRootId; + node.child_ids = {2}; + ui::AXNodeData node_2; + node_2.id = 2; + node_2.relative_bounds.offset_container_id = 100; + std::unique_ptr<BrowserAccessibilityManager> manager( + BrowserAccessibilityManager::Create( + MakeAXTreeUpdate(node, node_2), + test_browser_accessibility_delegate_.get())); + + // Verify that node 2's offset container was translated correctly. + BrowserAccessibilityFuchsia* child = + ToBrowserAccessibilityFuchsia(manager->GetFromID(2)); + ASSERT_TRUE(child); + auto child_node_data = child->ToFuchsiaNodeData(); + ASSERT_TRUE(child_node_data.has_container_id()); + // Offset container ID should default to 0 if the specified node doesn't + // exist. + EXPECT_EQ(child_node_data.container_id(), 0u); +} + +TEST_F(BrowserAccessibilityFuchsiaTest, ToFuchsiaNodeDataTranslatesNodeIDAndChildIDs) { ui::AXNodeData node; node.id = kRootId;
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc index 76c5a34..1c611ac 100644 --- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -810,12 +810,18 @@ AccessibilityEventsMenuListExpand #endif -// TODO(crbug.com/1230894): locks up with popup open, only on Mac +// TODO(crbug.com/1230894): locks up with popup open, only on Mac. Default +// action on selected HTML:option doesn't work, so no events are fired, and +// the test times out. #if BUILDFLAG(IS_MAC) #define MAYBE_AccessibilityEventsMenuListNext \ DISABLED_AccessibilityEventsMenuListNext +#define MAYBE_AccessibilityEventsMenuWithOptgroupListNext \ + DISABLED_AccessibilityEventsMenuWithOptgroupListNext #else #define MAYBE_AccessibilityEventsMenuListNext AccessibilityEventsMenuListNext +#define MAYBE_AccessibilityEventsMenuWithOptgroupListNext \ + AccessibilityEventsMenuWithOptgroupListNext #endif IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest, @@ -834,7 +840,7 @@ } IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest, - AccessibilityEventsMenuWithOptgroupListNext) { + MAYBE_AccessibilityEventsMenuWithOptgroupListNext) { RunEventTest(FILE_PATH_LITERAL("menulist-with-optgroup-next.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
diff --git a/content/browser/devtools/protocol/storage_handler.cc b/content/browser/devtools/protocol/storage_handler.cc index b88d013..4a0acc7 100644 --- a/content/browser/devtools/protocol/storage_handler.cc +++ b/content/browser/devtools/protocol/storage_handler.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" +#include "components/services/storage/public/cpp/buckets/bucket_locator.h" #include "components/services/storage/public/mojom/cache_storage_control.mojom.h" #include "components/services/storage/public/mojom/indexed_db_control.mojom.h" #include "content/browser/devtools/protocol/browser_handler.h" @@ -210,32 +211,37 @@ storage_keys_.erase(storage_key); } - void OnIndexedDBListChanged(const blink::StorageKey& storage_key) override { + void OnIndexedDBListChanged( + const storage::BucketLocator& bucket_locator) override { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!owner_) return; - auto found = storage_keys_.find(storage_key); + // TODO(crbug.com/1315371): Allow custom bucket names. + auto found = storage_keys_.find(bucket_locator.storage_key); if (found == storage_keys_.end()) return; // TODO(https://crbug.com/1199077): Pass storage key instead once // Chrome DevTools Protocol (CDP) supports it. - owner_->NotifyIndexedDBListChanged(storage_key.origin().Serialize()); + owner_->NotifyIndexedDBListChanged( + bucket_locator.storage_key.origin().Serialize()); } void OnIndexedDBContentChanged( - const blink::StorageKey& storage_key, + const storage::BucketLocator& bucket_locator, const std::u16string& database_name, const std::u16string& object_store_name) override { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!owner_) return; - auto found = storage_keys_.find(storage_key); + // TODO(crbug.com/1315371): Allow custom bucket names. + auto found = storage_keys_.find(bucket_locator.storage_key); if (found == storage_keys_.end()) return; // TODO(https://crbug.com/1199077): Pass storage key instead once // Chrome DevTools Protocol (CDP) supports it. - owner_->NotifyIndexedDBContentChanged(storage_key.origin().Serialize(), - database_name, object_store_name); + owner_->NotifyIndexedDBContentChanged( + bucket_locator.storage_key.origin().Serialize(), database_name, + object_store_name); } private:
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc index e5422cb..e23f05e8 100644 --- a/content/browser/indexed_db/indexed_db_backing_store.cc +++ b/content/browser/indexed_db/indexed_db_backing_store.cc
@@ -711,9 +711,7 @@ INTERNAL_READ_ERROR(SET_UP_METADATA); return s; } - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. - indexed_db::ReportSchemaVersion(db_schema_version, - bucket_locator_.storage_key); + indexed_db::ReportSchemaVersion(db_schema_version, bucket_locator_); if (!found) { // Initialize new backing store. db_schema_version = indexed_db::kLatestKnownSchemaVersion; @@ -793,10 +791,9 @@ s = db_->Write(write_batch.get()); write_batch.reset(); if (!s.ok()) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. indexed_db::ReportOpenStatus( indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_METADATA_SETUP, - bucket_locator_.storage_key); + bucket_locator_); INTERNAL_WRITE_ERROR(SET_UP_METADATA); return s; } @@ -804,11 +801,10 @@ if (clean_active_journal) { s = CleanUpBlobJournal(ActiveBlobJournalKey::Encode()); if (!s.ok()) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. indexed_db::ReportOpenStatus( indexed_db:: INDEXED_DB_BACKING_STORE_OPEN_FAILED_CLEANUP_JOURNAL_ERROR, - bucket_locator_.storage_key); + bucket_locator_); } } #if DCHECK_IS_ON() @@ -1132,11 +1128,11 @@ // static bool IndexedDBBackingStore::RecordCorruptionInfo( const base::FilePath& path_base, - const blink::StorageKey& storage_key, + const storage::BucketLocator& bucket_locator, const std::string& message) { auto filesystem = storage::CreateFilesystemProxy(); const base::FilePath info_path = - path_base.Append(indexed_db::ComputeCorruptionFileName(storage_key)); + path_base.Append(indexed_db::ComputeCorruptionFileName(bucket_locator)); if (IsPathTooLong(filesystem.get(), info_path)) return false;
diff --git a/content/browser/indexed_db/indexed_db_backing_store.h b/content/browser/indexed_db/indexed_db_backing_store.h index 53563f18..f1c9474 100644 --- a/content/browser/indexed_db/indexed_db_backing_store.h +++ b/content/browser/indexed_db/indexed_db_backing_store.h
@@ -50,7 +50,6 @@ namespace blink { class IndexedDBKeyRange; struct IndexedDBDatabaseMetadata; -class StorageKey; } // namespace blink namespace content { @@ -426,7 +425,7 @@ TransactionalLevelDBTransaction* transaction); static bool RecordCorruptionInfo(const base::FilePath& path_base, - const blink::StorageKey& storage_key, + const storage::BucketLocator& bucket_locator, const std::string& message); [[nodiscard]] virtual leveldb::Status GetRecord(
diff --git a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc index cf85aabd..97419ff 100644 --- a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc +++ b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
@@ -1633,22 +1633,23 @@ TEST_F(IndexedDBBackingStoreTest, ReadCorruptionInfo) { auto filesystem_proxy = std::make_unique<storage::FilesystemProxy>( storage::FilesystemProxy::UNRESTRICTED, base::FilePath()); + storage::BucketLocator bucket_locator; + bucket_locator.storage_key = blink::StorageKey(url::Origin()); // No `path_base`. EXPECT_TRUE(indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), - base::FilePath(), - StorageKey(Origin())) + base::FilePath(), bucket_locator) .empty()); const base::FilePath path_base = temp_dir_.GetPath(); - const StorageKey storage_key = - StorageKey::CreateFromStringForTesting("http://www.google.com/"); + bucket_locator.storage_key = + blink::StorageKey::CreateFromStringForTesting("http://www.google.com/"); ASSERT_FALSE(path_base.empty()); ASSERT_TRUE(PathIsWritable(path_base)); // File not found. EXPECT_TRUE(indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), path_base, - storage_key) + bucket_locator) .empty()); const base::FilePath info_path = @@ -1660,7 +1661,7 @@ std::string dummy_data; ASSERT_TRUE(base::WriteFile(info_path, dummy_data)); EXPECT_TRUE(indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), path_base, - storage_key) + bucket_locator) .empty()); EXPECT_FALSE(PathExists(info_path)); @@ -1668,42 +1669,42 @@ dummy_data.resize(5000, 'c'); ASSERT_TRUE(base::WriteFile(info_path, dummy_data)); EXPECT_TRUE(indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), path_base, - storage_key) + bucket_locator) .empty()); EXPECT_FALSE(PathExists(info_path)); // Random string. ASSERT_TRUE(base::WriteFile(info_path, "foo bar")); EXPECT_TRUE(indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), path_base, - storage_key) + bucket_locator) .empty()); EXPECT_FALSE(PathExists(info_path)); // Not a dictionary. ASSERT_TRUE(base::WriteFile(info_path, "[]")); EXPECT_TRUE(indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), path_base, - storage_key) + bucket_locator) .empty()); EXPECT_FALSE(PathExists(info_path)); // Empty dictionary. ASSERT_TRUE(base::WriteFile(info_path, "{}")); EXPECT_TRUE(indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), path_base, - storage_key) + bucket_locator) .empty()); EXPECT_FALSE(PathExists(info_path)); // Dictionary, no message key. ASSERT_TRUE(base::WriteFile(info_path, "{\"foo\":\"bar\"}")); EXPECT_TRUE(indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), path_base, - storage_key) + bucket_locator) .empty()); EXPECT_FALSE(PathExists(info_path)); // Dictionary, message key. ASSERT_TRUE(base::WriteFile(info_path, "{\"message\":\"bar\"}")); - std::string message = indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), - path_base, storage_key); + std::string message = indexed_db::ReadCorruptionInfo( + filesystem_proxy.get(), path_base, bucket_locator); EXPECT_FALSE(message.empty()); EXPECT_FALSE(PathExists(info_path)); EXPECT_EQ("bar", message); @@ -1711,7 +1712,7 @@ // Dictionary, message key and more. ASSERT_TRUE(base::WriteFile(info_path, "{\"message\":\"foo\",\"bar\":5}")); message = indexed_db::ReadCorruptionInfo(filesystem_proxy.get(), path_base, - storage_key); + bucket_locator); EXPECT_FALSE(message.empty()); EXPECT_FALSE(PathExists(info_path)); EXPECT_EQ("foo", message);
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc index 57ff57b..9489c7f9 100644 --- a/content/browser/indexed_db/indexed_db_context_impl.cc +++ b/content/browser/indexed_db/indexed_db_context_impl.cc
@@ -910,8 +910,7 @@ void IndexedDBContextImpl::NotifyIndexedDBListChanged( const storage::BucketLocator& bucket_locator) { for (auto& observer : observers_) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. - observer->OnIndexedDBListChanged(bucket_locator.storage_key); + observer->OnIndexedDBListChanged(bucket_locator); } } @@ -920,9 +919,8 @@ const std::u16string& database_name, const std::u16string& object_store_name) { for (auto& observer : observers_) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. - observer->OnIndexedDBContentChanged(bucket_locator.storage_key, - database_name, object_store_name); + observer->OnIndexedDBContentChanged(bucket_locator, database_name, + object_store_name); } } @@ -973,17 +971,13 @@ base::FilePath IndexedDBContextImpl::GetBlobStorePath( const storage::BucketLocator& bucket_locator) const { DCHECK(!is_incognito()); - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. - return data_path_.Append( - indexed_db::GetBlobStoreFileName(bucket_locator.storage_key)); + return data_path_.Append(indexed_db::GetBlobStoreFileName(bucket_locator)); } base::FilePath IndexedDBContextImpl::GetLevelDBPath( const storage::BucketLocator& bucket_locator) const { DCHECK(!is_incognito()); - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. - return data_path_.Append( - indexed_db::GetLevelDBFileName(bucket_locator.storage_key)); + return data_path_.Append(indexed_db::GetLevelDBFileName(bucket_locator)); } int64_t IndexedDBContextImpl::ReadUsageFromDisk(
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc b/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc index ca70c41..625ddcf 100644 --- a/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc +++ b/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc
@@ -23,6 +23,7 @@ #include "base/threading/thread.h" #include "base/time/default_clock.h" #include "build/build_config.h" +#include "components/services/storage/public/cpp/buckets/bucket_locator.h" #include "content/browser/indexed_db/indexed_db_callbacks.h" #include "content/browser/indexed_db/indexed_db_context_impl.h" #include "content/browser/indexed_db/indexed_db_database_callbacks.h" @@ -159,12 +160,13 @@ mojo::PendingReceiver<storage::mojom::IndexedDBObserver> receiver) : receiver_(this, std::move(receiver)) {} - void OnIndexedDBListChanged(const blink::StorageKey& storage_key) override { + void OnIndexedDBListChanged( + const storage::BucketLocator& bucket_locator) override { ++notify_list_changed_count; } void OnIndexedDBContentChanged( - const blink::StorageKey& storage_key, + const storage::BucketLocator& bucket_locator, const std::u16string& database_name, const std::u16string& object_store_name) override { ++notify_content_changed_count;
diff --git a/content/browser/indexed_db/indexed_db_factory_impl.cc b/content/browser/indexed_db/indexed_db_factory_impl.cc index 9407c0e..26cdab8 100644 --- a/content/browser/indexed_db/indexed_db_factory_impl.cc +++ b/content/browser/indexed_db/indexed_db_factory_impl.cc
@@ -101,7 +101,7 @@ leveldb::Status> CreateDatabaseDirectories(storage::FilesystemProxy* filesystem, const base::FilePath& path_base, - const blink::StorageKey& storage_key) { + const storage::BucketLocator& bucket_locator) { leveldb::Status status; if (filesystem->CreateDirectory(path_base) != base::File::Error::FILE_OK) { status = @@ -109,17 +109,17 @@ LOG(ERROR) << status.ToString() << ": \"" << path_base.AsUTF8Unsafe() << "\""; ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY, - storage_key); + bucket_locator); return {base::FilePath(), base::FilePath(), status}; } base::FilePath leveldb_path = - path_base.Append(indexed_db::GetLevelDBFileName(storage_key)); + path_base.Append(indexed_db::GetLevelDBFileName(bucket_locator)); base::FilePath blob_path = - path_base.Append(indexed_db::GetBlobStoreFileName(storage_key)); + path_base.Append(indexed_db::GetBlobStoreFileName(bucket_locator)); if (indexed_db::IsPathTooLong(filesystem, leveldb_path)) { ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG, - storage_key); + bucket_locator); status = leveldb::Status::IOError("File path too long"); return {base::FilePath(), base::FilePath(), status}; } @@ -432,10 +432,9 @@ const storage::BucketLocator& bucket_locator, const IndexedDBDatabaseError& error) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // Make a copy of storage_key as this is likely a reference to a member of a - // backing store which this function will be deleting. - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. - blink::StorageKey saved_storage_key(bucket_locator.storage_key); + // Make a copy of `bucket_locator` as this is likely a reference to a member + // of a backing store which this function will be deleting. + storage::BucketLocator saved_bucket_locator(bucket_locator); DCHECK(context_); base::FilePath path_base = context_->data_path(); @@ -444,7 +443,7 @@ std::string sanitized_message = base::UTF16ToUTF8(error.message()); base::ReplaceSubstringsAfterOffset(&sanitized_message, 0u, path_base.AsUTF8Unsafe(), "..."); - IndexedDBBackingStore::RecordCorruptionInfo(path_base, saved_storage_key, + IndexedDBBackingStore::RecordCorruptionInfo(path_base, saved_bucket_locator, sanitized_message); HandleBackingStoreFailure(bucket_locator); // Note: DestroyBackingStore only deletes LevelDB files, leaving all others, @@ -452,7 +451,7 @@ // The blob directory will be deleted when the database is recreated // the next time it is opened. const base::FilePath file_path = - path_base.Append(indexed_db::GetLevelDBFileName(saved_storage_key)); + path_base.Append(indexed_db::GetLevelDBFileName(saved_bucket_locator)); leveldb::Status s = class_factory_->leveldb_factory().DestroyLevelDB(file_path); DLOG_IF(ERROR, !s.ok()) << "Unable to delete backing store: " << s.ToString(); @@ -661,9 +660,8 @@ if (!is_incognito_and_in_memory) { // The database will be on-disk and not in-memory. auto filesystem_proxy = storage::CreateFilesystemProxy(); - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. std::tie(database_path, blob_path, s) = CreateDatabaseDirectories( - filesystem_proxy.get(), data_directory, bucket_locator.storage_key); + filesystem_proxy.get(), data_directory, bucket_locator); if (!s.ok()) return {IndexedDBBucketStateHandle(), s, CreateDefaultError(), IndexedDBDataLossInfo(), /*was_cold_open=*/true}; @@ -712,13 +710,11 @@ std::string sanitized_message = leveldb_env::GetCorruptionMessage(s); base::ReplaceSubstringsAfterOffset(&sanitized_message, 0u, data_directory.AsUTF8Unsafe(), "..."); - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. LOG(ERROR) << "Got corruption for " << bucket_locator.storage_key.GetDebugString() << ", " << sanitized_message; - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. IndexedDBBackingStore::RecordCorruptionInfo( - data_directory, bucket_locator.storage_key, sanitized_message); + data_directory, bucket_locator, sanitized_message); } } @@ -734,12 +730,11 @@ } if (UNLIKELY(!s.ok())) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY, - bucket_locator.storage_key); + bucket_locator); if (disk_full) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. + // TODO(crbug.com/1322226): Use bucket variant when available. context_->quota_manager_proxy()->NotifyWriteFailed( bucket_locator.storage_key); return {IndexedDBBucketStateHandle(), s, @@ -760,9 +755,8 @@ LevelDBScopes::TaskRunnerMode::kNewCleanupAndRevertSequences); if (UNLIKELY(!s.ok())) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY, - bucket_locator.storage_key); + bucket_locator); return {IndexedDBBucketStateHandle(), s, CreateDefaultError(), data_loss_info, /*was_cold_open=*/true}; @@ -770,7 +764,7 @@ if (!is_incognito_and_in_memory) ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_SUCCESS, - bucket_locator.storage_key); + bucket_locator); auto run_tasks_callback = base::BindRepeating( &IndexedDBFactoryImpl::MaybeRunTasksForBucket, @@ -850,17 +844,15 @@ if (!is_incognito_and_in_memory) { // Check for previous corruption, and if found then try to delete the // database. - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. std::string corruption_message = indexed_db::ReadCorruptionInfo( - filesystem_proxy.get(), data_directory, bucket_locator.storage_key); + filesystem_proxy.get(), data_directory, bucket_locator); if (UNLIKELY(!corruption_message.empty())) { LOG(ERROR) << "IndexedDB recovering from a corrupted (and deleted) " "database."; if (is_first_attempt) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. ReportOpenStatus( indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_PRIOR_CORRUPTION, - bucket_locator.storage_key); + bucket_locator); } data_loss_info.status = blink::mojom::IDBDataLoss::Total; data_loss_info.message = base::StrCat( @@ -926,19 +918,17 @@ LOG(ERROR) << "IndexedDB had an error checking schema, treating it as " "failure to open: " << status.ToString(); - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. ReportOpenStatus( indexed_db:: INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA, - bucket_locator.storage_key); + bucket_locator); return {nullptr, status, std::move(data_loss_info), /*is_disk_full=*/false}; } else if (UNLIKELY(!are_schemas_known)) { LOG(ERROR) << "IndexedDB backing store had unknown schema, treating it as " "failure to open."; - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. ReportOpenStatus( indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA, - bucket_locator.storage_key); + bucket_locator); return {nullptr, leveldb::Status::Corruption("Unknown IndexedDB schema"), std::move(data_loss_info), /*is_disk_full=*/false}; } @@ -990,7 +980,7 @@ HandleBackingStoreCorruption(bucket_locator, error); } else { if (status.IsIOError()) { - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. + // TODO(crbug.com/1322226): Use bucket variant when available. context_->quota_manager_proxy()->NotifyWriteFailed( bucket_locator.storage_key); }
diff --git a/content/browser/indexed_db/indexed_db_factory_unittest.cc b/content/browser/indexed_db/indexed_db_factory_unittest.cc index 31e3061..4bb449e 100644 --- a/content/browser/indexed_db/indexed_db_factory_unittest.cc +++ b/content/browser/indexed_db/indexed_db_factory_unittest.cc
@@ -104,11 +104,6 @@ EXPECT_TRUE(success); } } -// TODO(crbug.com/1218100): Investigate why windows fails this check. -#if !BUILDFLAG(IS_WIN) - if (temp_dir_.IsValid()) - ASSERT_TRUE(temp_dir_.Delete()); -#endif IndexedDBClassFactory::Get()->SetLevelDBFactoryForTesting(nullptr); quota_manager_.reset(); } @@ -527,8 +522,7 @@ EXPECT_FALSE(bucket_state_handle.bucket_state()->ShouldRunCompaction()); } -// Flaky as reported in: https://crbug.com/1322325 -TEST_F(IndexedDBFactoryTest, DISABLED_InMemoryFactoriesStay) { +TEST_F(IndexedDBFactoryTest, InMemoryFactoriesStay) { SetupInMemoryContext(); ASSERT_TRUE(context()->IsInMemoryContext());
diff --git a/content/browser/indexed_db/indexed_db_leveldb_operations.cc b/content/browser/indexed_db/indexed_db_leveldb_operations.cc index ba4139f0..c85dc9b 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_operations.cc +++ b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
@@ -15,6 +15,7 @@ #include "components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_database.h" #include "components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_iterator.h" #include "components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_transaction.h" +#include "components/services/storage/public/cpp/buckets/bucket_locator.h" #include "content/browser/indexed_db/indexed_db_data_format_version.h" #include "content/browser/indexed_db/indexed_db_data_loss_info.h" #include "content/browser/indexed_db/indexed_db_leveldb_env.h" @@ -53,10 +54,13 @@ FILE_PATH_LITERAL(".leveldb"); // static -base::FilePath GetBlobStoreFileName(const blink::StorageKey& storage_key) { +base::FilePath GetBlobStoreFileName( + const storage::BucketLocator& bucket_locator) { std::string storage_key_id; - if (storage_key.IsFirstPartyContext()) { - storage_key_id = storage::GetIdentifierFromOrigin(storage_key.origin()); + // TODO(crbug.com/1315371): Allow custom bucket names. + if (bucket_locator.storage_key.IsFirstPartyContext()) { + storage_key_id = + storage::GetIdentifierFromOrigin(bucket_locator.storage_key.origin()); } else { // TODO(crbug.com/1218100): This is a stop-gap to prevent crashes, we need // to point to a real storage bucket here not a transient one. We only @@ -73,10 +77,13 @@ } // static -base::FilePath GetLevelDBFileName(const blink::StorageKey& storage_key) { +base::FilePath GetLevelDBFileName( + const storage::BucketLocator& bucket_locator) { std::string storage_key_id; - if (storage_key.IsFirstPartyContext()) { - storage_key_id = storage::GetIdentifierFromOrigin(storage_key.origin()); + // TODO(crbug.com/1315371): Allow custom bucket names. + if (bucket_locator.storage_key.IsFirstPartyContext()) { + storage_key_id = + storage::GetIdentifierFromOrigin(bucket_locator.storage_key.origin()); } else { // TODO(crbug.com/1218100): This is a stop-gap to prevent crashes, we need // to point to a real storage bucket here not a transient one. We only @@ -92,8 +99,9 @@ .AddExtension(kLevelDBExtension); } -base::FilePath ComputeCorruptionFileName(const blink::StorageKey& storage_key) { - return GetLevelDBFileName(storage_key) +base::FilePath ComputeCorruptionFileName( + const storage::BucketLocator& bucket_locator) { + return GetLevelDBFileName(bucket_locator) .Append(FILE_PATH_LITERAL("corruption_info.json")); } @@ -128,9 +136,9 @@ std::string ReadCorruptionInfo(storage::FilesystemProxy* filesystem_proxy, const base::FilePath& path_base, - const blink::StorageKey& storage_key) { + const storage::BucketLocator& bucket_locator) { const base::FilePath info_path = - path_base.Append(indexed_db::ComputeCorruptionFileName(storage_key)); + path_base.Append(indexed_db::ComputeCorruptionFileName(bucket_locator)); std::string message; if (IsPathTooLong(filesystem_proxy, info_path)) return message;
diff --git a/content/browser/indexed_db/indexed_db_leveldb_operations.h b/content/browser/indexed_db/indexed_db_leveldb_operations.h index 2990c23..c6c9f40 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_operations.h +++ b/content/browser/indexed_db/indexed_db_leveldb_operations.h
@@ -25,9 +25,9 @@ // Contains common operations for LevelDBTransactions and/or LevelDBDatabases. -namespace blink { -class StorageKey; -} // namespace blink +namespace storage { +struct BucketLocator; +} // namespace storage namespace content { class TransactionalLevelDBDatabase; @@ -41,9 +41,11 @@ extern const base::FilePath::CharType kIndexedDBExtension[]; extern const base::FilePath::CharType kLevelDBExtension[]; -base::FilePath GetBlobStoreFileName(const blink::StorageKey& storage_key); -base::FilePath GetLevelDBFileName(const blink::StorageKey& storage_key); -base::FilePath ComputeCorruptionFileName(const blink::StorageKey& storage_key); +base::FilePath GetBlobStoreFileName( + const storage::BucketLocator& bucket_locator); +base::FilePath GetLevelDBFileName(const storage::BucketLocator& bucket_locator); +base::FilePath ComputeCorruptionFileName( + const storage::BucketLocator& bucket_locator); // Returns if the given file path is too long for the current operating system's // file system. @@ -57,7 +59,7 @@ std::string CONTENT_EXPORT ReadCorruptionInfo(storage::FilesystemProxy* filesystem_proxy, const base::FilePath& path_base, - const blink::StorageKey& storage_key); + const storage::BucketLocator& bucket_locator); // Was able to use LevelDB to read the data w/o error, but the data read was not // in the expected format.
diff --git a/content/browser/indexed_db/indexed_db_pre_close_task_queue.h b/content/browser/indexed_db/indexed_db_pre_close_task_queue.h index 0b8a64cf..70b2149 100644 --- a/content/browser/indexed_db/indexed_db_pre_close_task_queue.h +++ b/content/browser/indexed_db/indexed_db_pre_close_task_queue.h
@@ -85,8 +85,8 @@ friend class IndexedDBPreCloseTaskQueue; bool set_metadata_was_called_ = false; - // Raw pointer is safe because |database_| is owned by the - // IndexedDBStorageKeyState. + // Raw pointer is safe because `database_` is owned by the + // IndexedDBBucketState. const raw_ptr<leveldb::DB> database_; };
diff --git a/content/browser/indexed_db/indexed_db_quota_client.cc b/content/browser/indexed_db/indexed_db_quota_client.cc index e9443ca..1a60caf 100644 --- a/content/browser/indexed_db/indexed_db_quota_client.cc +++ b/content/browser/indexed_db/indexed_db_quota_client.cc
@@ -45,7 +45,6 @@ DCHECK_EQ(bucket.type, StorageType::kTemporary); // Skip non-default buckets until Storage Buckets are supported for IndexedDB. - // TODO(crbug.com/1218100): Integrate IndexedDB with StorageBuckets. if (!bucket.is_default) { std::move(callback).Run(0); return; @@ -63,7 +62,6 @@ std::vector<StorageKey> storage_keys; for (const auto& bucket_locator : bucket_locators) storage_keys.push_back(bucket_locator.storage_key); - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. std::move(callback).Run(std::move(storage_keys)); } @@ -75,13 +73,11 @@ DCHECK(!callback.is_null()); // Skip non-default buckets until Storage Buckets are supported for IndexedDB. - // TODO(crbug.com/1218100): Integrate IndexedDB with StorageBuckets. if (!bucket.is_default) { std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk); return; } - // TODO(crbug.com/1218100): Propagate BucketLocator to callee. indexed_db_context_.DeleteForBucket( bucket.storage_key, base::BindOnce(
diff --git a/content/browser/indexed_db/indexed_db_quota_client.h b/content/browser/indexed_db/indexed_db_quota_client.h index 666a520..77a02ee 100644 --- a/content/browser/indexed_db/indexed_db_quota_client.h +++ b/content/browser/indexed_db/indexed_db_quota_client.h
@@ -17,7 +17,7 @@ namespace storage { struct BucketLocator; -} +} // namespace storage namespace content { class IndexedDBContextImpl;
diff --git a/content/browser/indexed_db/indexed_db_reporting.cc b/content/browser/indexed_db/indexed_db_reporting.cc index ea95b22..4cef898 100644 --- a/content/browser/indexed_db/indexed_db_reporting.cc +++ b/content/browser/indexed_db/indexed_db_reporting.cc
@@ -9,6 +9,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/strcat.h" +#include "components/services/storage/public/cpp/buckets/bucket_locator.h" #include "content/browser/indexed_db/indexed_db_leveldb_coding.h" #include "content/browser/indexed_db/indexed_db_leveldb_env.h" #include "third_party/blink/public/common/storage_key/storage_key.h" @@ -18,9 +19,9 @@ namespace { -std::string StorageKeyToCustomHistogramSuffix( - const blink::StorageKey& storage_key) { - if (storage_key.origin().host() == "docs.google.com") +std::string BucketLocatorToCustomHistogramSuffix( + const storage::BucketLocator& bucket_locator) { + if (bucket_locator.storage_key.origin().host() == "docs.google.com") return ".Docs"; return std::string(); } @@ -64,10 +65,11 @@ } // namespace void ReportOpenStatus(IndexedDBBackingStoreOpenResult result, - const blink::StorageKey& storage_key) { + const storage::BucketLocator& bucket_locator) { base::UmaHistogramEnumeration("WebCore.IndexedDB.BackingStore.OpenStatus", result, INDEXED_DB_BACKING_STORE_OPEN_MAX); - const std::string suffix = StorageKeyToCustomHistogramSuffix(storage_key); + const std::string suffix = + BucketLocatorToCustomHistogramSuffix(bucket_locator); // Data from the WebCore.IndexedDB.BackingStore.OpenStatus histogram is used // to generate a graph. So as not to alter the meaning of that graph, // continue to collect all stats there (above) but also now collect docs stats @@ -91,10 +93,12 @@ ->Add(location); } -void ReportSchemaVersion(int version, const blink::StorageKey& storage_key) { +void ReportSchemaVersion(int version, + const storage::BucketLocator& bucket_locator) { UMA_HISTOGRAM_ENUMERATION("WebCore.IndexedDB.SchemaVersion", version, kLatestKnownSchemaVersion + 1); - const std::string suffix = StorageKeyToCustomHistogramSuffix(storage_key); + const std::string suffix = + BucketLocatorToCustomHistogramSuffix(bucket_locator); if (!suffix.empty()) { base::LinearHistogram::FactoryGet( base::StrCat({"WebCore.IndexedDB.SchemaVersion", suffix}), 0,
diff --git a/content/browser/indexed_db/indexed_db_reporting.h b/content/browser/indexed_db/indexed_db_reporting.h index 224340a..6299afe2 100644 --- a/content/browser/indexed_db/indexed_db_reporting.h +++ b/content/browser/indexed_db/indexed_db_reporting.h
@@ -10,9 +10,9 @@ #include "base/logging.h" #include "third_party/leveldatabase/src/include/leveldb/status.h" -namespace blink { -class StorageKey; -} +namespace storage { +struct BucketLocator; +} // namespace storage namespace content { namespace indexed_db { @@ -92,12 +92,13 @@ }; void ReportOpenStatus(IndexedDBBackingStoreOpenResult result, - const blink::StorageKey& storage_key); + const storage::BucketLocator& bucket_locator); void ReportInternalError(const char* type, IndexedDBBackingStoreErrorSource location); -void ReportSchemaVersion(int version, const blink::StorageKey& storage_key); +void ReportSchemaVersion(int version, + const storage::BucketLocator& bucket_locator); void ReportLevelDBError(const std::string& histogram_name, const leveldb::Status& s);
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc index e5ae0795..501e7bc 100644 --- a/content/browser/webauth/authenticator_impl_unittest.cc +++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -3484,7 +3484,8 @@ EXPECT_EQ(AuthenticatorMakeCredential(std::move(options)).status, test.success ? AuthenticatorStatus::SUCCESS - : AuthenticatorStatus::NOT_ALLOWED_ERROR); + : AuthenticatorStatus:: + REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED); } } @@ -3522,7 +3523,8 @@ EXPECT_EQ(AuthenticatorGetAssertion(std::move(options)).status, test.success ? AuthenticatorStatus::SUCCESS - : AuthenticatorStatus::NOT_ALLOWED_ERROR); + : AuthenticatorStatus:: + REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED); } } @@ -3535,14 +3537,20 @@ std::string remote_origin; std::string rp_id; std::string app_id; - bool success; + AuthenticatorStatus expected; } test_cases[] = { - {kCorpCrdOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, true}, - {kCorpCrdOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, false}, - {kOtherRdpOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, false}, - {kOtherRdpOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, false}, - {kExampleOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, false}, - {kExampleOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, false}, + {kCorpCrdOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, + AuthenticatorStatus::SUCCESS}, + {kCorpCrdOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, + AuthenticatorStatus::INVALID_DOMAIN}, + {kOtherRdpOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, + AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED}, + {kOtherRdpOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, + AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED}, + {kExampleOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, + AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED}, + {kExampleOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, + AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED}, }; for (const auto& test : test_cases) { @@ -3560,7 +3568,7 @@ url::Origin::Create(GURL(test.remote_origin)), true); auto result = AuthenticatorMakeCredential(std::move(options)); - EXPECT_EQ(test.success, result.status == AuthenticatorStatus::SUCCESS); + EXPECT_EQ(result.status, test.expected); } } @@ -3573,14 +3581,20 @@ std::string remote_origin; std::string rp_id; std::string app_id; - bool success; + AuthenticatorStatus expected; } test_cases[] = { - {kCorpCrdOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, true}, - {kCorpCrdOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, false}, - {kOtherRdpOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, false}, - {kOtherRdpOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, false}, - {kExampleOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, false}, - {kExampleOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, false}, + {kCorpCrdOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, + AuthenticatorStatus::SUCCESS}, + {kCorpCrdOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, + AuthenticatorStatus::INVALID_DOMAIN}, + {kOtherRdpOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, + AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED}, + {kOtherRdpOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, + AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED}, + {kExampleOrigin, kExampleOrigin, kExampleRpId, kExampleAppid, + AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED}, + {kExampleOrigin, kExampleOrigin, kExampleRpId, kOtherAppid, + AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED}, }; for (const auto& test : test_cases) { @@ -3602,7 +3616,7 @@ options->allow_credentials[0].id, test.rp_id)); auto result = AuthenticatorGetAssertion(std::move(options)); - EXPECT_EQ(test.success, result.status == AuthenticatorStatus::SUCCESS); + EXPECT_EQ(result.status, test.expected); } }
diff --git a/content/browser/webauth/webauth_request_security_checker.cc b/content/browser/webauth/webauth_request_security_checker.cc index e61cc29a..535bf74 100644 --- a/content/browser/webauth/webauth_request_security_checker.cc +++ b/content/browser/webauth/webauth_request_security_checker.cc
@@ -208,7 +208,8 @@ ->GetWebAuthenticationDelegate() ->OriginMayUseRemoteDesktopClientOverride( render_frame_host_->GetBrowserContext(), caller_origin)) { - return blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR; + return blink::mojom::AuthenticatorStatus:: + REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED; } relying_party_origin = remote_desktop_client_override->origin; } @@ -245,7 +246,8 @@ ->GetWebAuthenticationDelegate() ->OriginMayUseRemoteDesktopClientOverride( render_frame_host_->GetBrowserContext(), caller_origin)) { - return blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR; + return blink::mojom::AuthenticatorStatus:: + REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED; } caller_origin = remote_desktop_client_override->origin; }
diff --git a/content/common/common_param_traits_unittest.cc b/content/common/common_param_traits_unittest.cc index deb59ae..f42dda0 100644 --- a/content/common/common_param_traits_unittest.cc +++ b/content/common/common_param_traits_unittest.cc
@@ -88,9 +88,9 @@ TEST(IPCMessageTest, ListValue) { base::ListValue input; - input.Append(42.42); - input.Append("forty"); - input.Append(std::make_unique<base::Value>()); + input.GetList().Append(42.42); + input.GetList().Append("forty"); + input.GetList().Append(base::Value()); IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); IPC::WriteParam(&msg, input);
diff --git a/content/common/font_list_fontconfig.cc b/content/common/font_list_fontconfig.cc index 42bb1ea..2481646 100644 --- a/content/common/font_list_fontconfig.cc +++ b/content/common/font_list_fontconfig.cc
@@ -60,11 +60,11 @@ sorted_families.insert("Serif"); for (const auto& family : sorted_families) { - std::unique_ptr<base::ListValue> font_item(new base::ListValue()); - font_item->Append(family); - font_item->Append(family); // localized name. + base::Value::List font_item; + font_item.Append(family); + font_item.Append(family); // localized name. // TODO(yusukes): Support localized family names. - font_list->Append(std::move(font_item)); + font_list->GetList().Append(std::move(font_item)); } return font_list;
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index a678392..984205b3 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc
@@ -45,6 +45,7 @@ #include "content/public/browser/url_loader_request_interceptor.h" #include "content/public/browser/vpn_service_proxy.h" #include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_view_delegate.h" #include "content/public/common/alternative_error_page_override_info.mojom.h" #include "content/public/common/content_features.h" #include "content/public/common/url_utils.h"
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index c849b17f..97286bf0 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1711,6 +1711,8 @@ LOGIN_REQUESTEXTERNALLOGOUT = 1648, LOGIN_NOTIFYEXTERNALLOGOUTDONE = 1649, PASSWORDSPRIVATE_RECORDCHANGEPASSWORDFLOWSTARTED = 1650, + ENTERPRISEREPORTINGPRIVATE_ENQUEUERECORD = 1651, + FILEMANAGERPRIVATE_SENDFEEDBACK = 1652, // Last entry: Add new entries above, then run: // tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/gin/array_buffer.cc b/gin/array_buffer.cc index 917ab23..0034bb4 100644 --- a/gin/array_buffer.cc +++ b/gin/array_buffer.cc
@@ -8,6 +8,7 @@ #include <stdlib.h> #include "base/allocator/partition_allocator/page_allocator.h" +#include "base/allocator/partition_allocator/partition_alloc.h" #include "base/bits.h" #include "base/check_op.h" #include "build/build_config.h" @@ -28,18 +29,44 @@ "array buffers must have two internal fields"); // ArrayBufferAllocator ------------------------------------------------------- +ArrayBufferAllocator::ArrayBufferAllocator() { + // When the V8 sandbox is enabled, the ArrayBuffer partition must be + // placed inside of it. For that, PA's ConfigurablePool is created inside + // the V8 sandbox during initialization of V8, and this partition is + // placed inside the configurable pool. + // Note that V8 must already have been initialized at this point, otherwise + // the configurable pool will not be available and the partition will be + // created in the default pool instead. The following CHECK verifies that. +#if defined(V8_SANDBOXED_POINTERS) + // TODO(saelo) consider adding a V8::IsSandboxInitialized(). + CHECK_GT(v8::V8::GetSandboxSizeInBytes(), 0u); +#endif + // These configuration options are copied from blink's ArrayBufferPartition. + partition_.init({ + base::PartitionOptions::AlignedAlloc::kDisallowed, + base::PartitionOptions::ThreadCache::kDisabled, + base::PartitionOptions::Quarantine::kAllowed, + base::PartitionOptions::Cookie::kAllowed, + base::PartitionOptions::BackupRefPtr::kDisabled, + base::PartitionOptions::UseConfigurablePool::kIfAvailable, + }); +} void* ArrayBufferAllocator::Allocate(size_t length) { - // TODO(bbudge) Use partition allocator for malloc/calloc allocations. - return calloc(1, length); + int flags = partition_alloc::AllocFlags::kZeroFill | + partition_alloc::AllocFlags::kReturnNull; + return partition_.root()->AllocWithFlags(flags, length, + "gin::ArrayBufferAllocator"); } void* ArrayBufferAllocator::AllocateUninitialized(size_t length) { - return malloc(length); + int flags = partition_alloc::AllocFlags::kReturnNull; + return partition_.root()->AllocWithFlags(flags, length, + "gin::ArrayBufferAllocator"); } void ArrayBufferAllocator::Free(void* data, size_t length) { - free(data); + partition_.root()->Free(data); } ArrayBufferAllocator* ArrayBufferAllocator::SharedInstance() {
diff --git a/gin/array_buffer.h b/gin/array_buffer.h index cf8a650..5bfed07 100644 --- a/gin/array_buffer.h +++ b/gin/array_buffer.h
@@ -8,6 +8,7 @@ #include <stddef.h> #include <stdint.h> +#include "base/allocator/partition_allocator/partition_alloc.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/memory/shared_memory_mapper.h" @@ -20,11 +21,16 @@ class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator { public: + ArrayBufferAllocator(); + void* Allocate(size_t length) override; void* AllocateUninitialized(size_t length) override; void Free(void* data, size_t length) override; GIN_EXPORT static ArrayBufferAllocator* SharedInstance(); + + private: + base::PartitionAllocator partition_; }; class GIN_EXPORT ArrayBuffer {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc index d0a24769..1ef96d7 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -1662,6 +1662,11 @@ caps.image_ab30 = feature_info_->feature_flags().chromium_image_ab30; caps.image_ycbcr_p010 = feature_info_->feature_flags().chromium_image_ycbcr_p010; + if (feature_info_->workarounds().client_max_texture_size) { + caps.max_texture_size = + std::min(caps.max_texture_size, + feature_info_->workarounds().client_max_texture_size); + } caps.max_copy_texture_chromium_size = feature_info_->workarounds().max_copy_texture_chromium_size; caps.render_buffer_format_bgra8888 = @@ -2242,6 +2247,16 @@ std::copy(std::begin(scissor_), std::end(scissor_), params); break; + case GL_MAX_TEXTURE_SIZE: + case GL_MAX_CUBE_MAP_TEXTURE_SIZE: + case GL_MAX_3D_TEXTURE_SIZE: + if (feature_info_->workarounds().client_max_texture_size) { + *params = std::min( + *params, static_cast<T>( + feature_info_->workarounds().client_max_texture_size)); + } + break; + default: break; }
diff --git a/gpu/command_buffer/service/shared_image_backing_shared_memory.cc b/gpu/command_buffer/service/shared_image_backing_shared_memory.cc index 42d1c2b..6053d2db 100644 --- a/gpu/command_buffer/service/shared_image_backing_shared_memory.cc +++ b/gpu/command_buffer/service/shared_image_backing_shared_memory.cc
@@ -7,10 +7,12 @@ #include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/notreached.h" +#include "base/trace_event/process_memory_dump.h" #include "components/viz/common/resources/resource_format.h" #include "components/viz/common/resources/resource_format_utils.h" #include "components/viz/common/resources/resource_sizes.h" #include "gpu/command_buffer/common/mailbox.h" +#include "gpu/command_buffer/common/shared_image_trace_utils.h" #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/memory_tracking.h" #include "gpu/command_buffer/service/shared_context_state.h" @@ -159,6 +161,21 @@ manager, this, tracker); } +void SharedImageBackingSharedMemory::OnMemoryDump( + const std::string& dump_name, + base::trace_event::MemoryAllocatorDump* dump, + base::trace_event::ProcessMemoryDump* pmd, + uint64_t client_tracing_id) { + // Add a |shared_memory_guid| which expresses shared ownership between the + // various GPU dumps. + auto shared_memory_guid = shared_memory_wrapper_.GetMappingGuid(); + if (!shared_memory_guid.is_empty()) { + auto client_guid = GetSharedImageGUIDForTracing(mailbox()); + pmd->CreateSharedMemoryOwnershipEdge(client_guid, shared_memory_guid, + 0 /* importance */); + } +} + SharedImageBackingSharedMemory::SharedImageBackingSharedMemory( const Mailbox& mailbox, viz::ResourceFormat format,
diff --git a/gpu/command_buffer/service/shared_image_backing_shared_memory.h b/gpu/command_buffer/service/shared_image_backing_shared_memory.h index 608c1164..cdeea03 100644 --- a/gpu/command_buffer/service/shared_image_backing_shared_memory.h +++ b/gpu/command_buffer/service/shared_image_backing_shared_memory.h
@@ -71,6 +71,11 @@ private: class SharedImageRepresentationSharedMemory; + void OnMemoryDump(const std::string& dump_name, + base::trace_event::MemoryAllocatorDump* dump, + base::trace_event::ProcessMemoryDump* pmd, + uint64_t client_tracing_id) override; + // Set for shared memory GMB. SharedMemoryRegionWrapper shared_memory_wrapper_; };
diff --git a/gpu/command_buffer/service/shared_memory_region_wrapper.cc b/gpu/command_buffer/service/shared_memory_region_wrapper.cc index 2130996..85644fbf 100644 --- a/gpu/command_buffer/service/shared_memory_region_wrapper.cc +++ b/gpu/command_buffer/service/shared_memory_region_wrapper.cc
@@ -124,4 +124,8 @@ return stride_; } +const base::UnguessableToken& SharedMemoryRegionWrapper::GetMappingGuid() { + return mapping_.guid(); +} + } // namespace gpu
diff --git a/gpu/command_buffer/service/shared_memory_region_wrapper.h b/gpu/command_buffer/service/shared_memory_region_wrapper.h index 280a09b..2ec4e2d 100644 --- a/gpu/command_buffer/service/shared_memory_region_wrapper.h +++ b/gpu/command_buffer/service/shared_memory_region_wrapper.h
@@ -7,6 +7,7 @@ #include "base/containers/span.h" #include "base/memory/shared_memory_mapping.h" +#include "base/unguessable_token.h" #include "components/viz/common/resources/resource_format.h" #include "ui/gfx/geometry/size.h" @@ -36,6 +37,7 @@ uint8_t* GetMemory() const; base::span<const uint8_t> GetMemoryAsSpan() const; size_t GetStride() const; + const base::UnguessableToken& GetMappingGuid(); private: base::WritableSharedMemoryMapping mapping_;
diff --git a/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json b/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json new file mode 100644 index 0000000..cccc8ea --- /dev/null +++ b/infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json
@@ -0,0 +1,92 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-webview-10-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-webview-10-x86-rel-tests", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-webview-10-x86-rel-tests", + "group": "tryserver.chromium.android" + } + ] + } + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.android", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-x86-rel/properties.json b/infra/config/generated/builders/ci/android-x86-rel/properties.json new file mode 100644 index 0000000..be0fc9e --- /dev/null +++ b/infra/config/generated/builders/ci/android-x86-rel/properties.json
@@ -0,0 +1,104 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-webview-10-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-x86-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "android-webview-10-x86-rel-tests", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-webview-10-x86-rel-tests", + "group": "tryserver.chromium.android" + } + ] + } + }, + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics" + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.android", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-webview-10-x86-rel-tests/properties.json b/infra/config/generated/builders/try/android-webview-10-x86-rel-tests/properties.json new file mode 100644 index 0000000..3b836d93 --- /dev/null +++ b/infra/config/generated/builders/try/android-webview-10-x86-rel-tests/properties.json
@@ -0,0 +1,99 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-webview-10-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-x86-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "android-webview-10-x86-rel-tests", + "project": "chromium" + } + ] + } + }, + "$build/goma": { + "enable_ats": true, + "rpc_extra_params": "?prod", + "server_host": "goma.chromium.org", + "use_luci_auth": true + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "tryserver.chromium.android", + "recipe": "chromium_trybot" +} \ No newline at end of file
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index eac72bb..f2cc36f 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -526,6 +526,10 @@ includable_only: true } builders { + name: "chromium/try/android-webview-10-x86-rel-tests" + includable_only: true + } + builders { name: "chromium/try/android-webview-12-x64-dbg" includable_only: true }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index ad00147..77e4c44 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -27274,6 +27274,85 @@ } } builders { + name: "android-webview-10-x86-rel-tests" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-18.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/android-webview-10-x86-rel-tests/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.android",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "android-webview-12-x64-dbg-tests" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -27511,6 +27590,85 @@ } } builders { + name: "android-x86-rel" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-18.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/android-x86-rel/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.android",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "chromeos-amd64-generic-asan-rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -52342,6 +52500,96 @@ } } builders { + name: "android-webview-10-x86-rel-tests" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-18.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/try/android-webview-10-x86-rel-tests/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "tryserver.chromium.android",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium_trybot"' + '}' + execution_timeout_secs: 14400 + expiration_secs: 7200 + grace_period { + seconds: 120 + } + caches { + name: "win_toolchain" + path: "win_toolchain" + } + build_numbers: YES + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage { + value: 5 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "android-webview-12-x64-dbg" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 690a927..2bd0391 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -1173,6 +1173,11 @@ short_name: "64" } builders { + name: "buildbucket/luci.chromium.ci/android-x86-rel" + category: "chromium.android|builder|x86" + short_name: "x86" + } + builders { name: "buildbucket/luci.chromium.ci/Marshmallow 64 bit Tester" category: "chromium.android|tester|phone" short_name: "M" @@ -3241,6 +3246,11 @@ short_name: "64" } builders { + name: "buildbucket/luci.chromium.ci/android-x86-rel" + category: "builder|x86" + short_name: "x86" + } + builders { name: "buildbucket/luci.chromium.ci/Deterministic Android" category: "builder|det" short_name: "rel" @@ -3331,6 +3341,11 @@ short_name: "P" } builders { + name: "buildbucket/luci.chromium.ci/android-webview-10-x86-rel-tests" + category: "tester|x86" + short_name: "10" + } + builders { name: "buildbucket/luci.chromium.ci/android-bfcache-rel" category: "bfcache" short_name: "bfc" @@ -14711,6 +14726,9 @@ name: "buildbucket/luci.chromium.try/android-weblayer-pie-x86-wpt-smoketest" } builders { + name: "buildbucket/luci.chromium.try/android-webview-10-x86-rel-tests" + } + builders { name: "buildbucket/luci.chromium.try/android-webview-12-x64-dbg" } builders { @@ -15825,6 +15843,9 @@ name: "buildbucket/luci.chromium.try/android-weblayer-pie-x86-wpt-smoketest" } builders { + name: "buildbucket/luci.chromium.try/android-webview-10-x86-rel-tests" + } + builders { name: "buildbucket/luci.chromium.try/android-webview-12-x64-dbg" } builders {
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 6147ade..fb0820f 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -4740,6 +4740,20 @@ } } job { + id: "android-webview-10-x86-rel-tests" + realm: "ci" + acls { + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + } + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "android-webview-10-x86-rel-tests" + } +} +job { id: "android-webview-12-x64-dbg-tests" realm: "ci" acls { @@ -4774,6 +4788,16 @@ } } job { + id: "android-x86-rel" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "android-x86-rel" + } +} +job { id: "chromeos-amd64-generic-asan-rel" realm: "ci" acl_sets: "ci" @@ -7339,6 +7363,7 @@ triggers: "android-weblayer-x86-rel" triggers: "android-webview-pie-x86-wpt-fyi-rel" triggers: "android-x86-fyi-rel" + triggers: "android-x86-rel" triggers: "chromeos-amd64-generic-asan-rel" triggers: "chromeos-amd64-generic-asan-rel (reclient shadow)" triggers: "chromeos-amd64-generic-cfi-thin-lto-rel"
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg index cf76660..7a7ba69 100644 --- a/infra/config/generated/luci/realms.cfg +++ b/infra/config/generated/luci/realms.cfg
@@ -148,6 +148,7 @@ values: "android-weblayer-marshmallow-x86-rel-tests" values: "android-weblayer-oreo-x86-rel-tests" values: "android-weblayer-pie-x86-rel-tests" + values: "android-webview-10-x86-rel-tests" values: "android-webview-12-x64-dbg-tests" values: "linux-lacros-dbg-tests-fyi" values: "linux-lacros-tester-fyi-rel"
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index c083b7e..8db6d98 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -304,6 +304,72 @@ ) ci.builder( + name = "android-x86-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + "enable_reclient", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config( + config = "main_builder_mb", + ), + build_gs_bucket = "chromium-android-archive", + ), + console_view_entry = consoles.console_view_entry( + category = "builder|x86", + short_name = "x86", + ), + cq_mirrors_console_view = "mirrors", + reclient_jobs = rbe_jobs.DEFAULT, + # tree_closing will be set to true and sherrif_rotations + # will be enabled once we have confirmed that these tests + # are passing successfully + # crbug.com/1250464 + tree_closing = False, + sheriff_rotations = args.ignore_default(None), +) + +ci.thin_tester( + name = "android-webview-10-x86-rel-tests", + console_view_entry = consoles.console_view_entry( + category = "tester|x86", + short_name = "10", + ), + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config( + config = "main_builder_mb", + ), + build_gs_bucket = "chromium-android-archive", + ), + triggered_by = ["ci/android-x86-rel"], + # To remove once we've confirmed this works correctly + # crbug.com/1250464 + sheriff_rotations = args.ignore_default(None), +) + +ci.builder( name = "Cast Android (dbg)", branch_selector = branches.STANDARD_MILESTONE, console_view_entry = consoles.console_view_entry(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index f14e306..c29cadc5 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -350,6 +350,14 @@ ) try_.builder( + name = "android-webview-10-x86-rel-tests", + mirrors = [ + "ci/android-x86-rel", + "ci/android-webview-10-x86-rel-tests", + ], +) + +try_.builder( name = "android-11-x86-fyi-rel", )
diff --git a/ios/chrome/app/app_startup_parameters.h b/ios/chrome/app/app_startup_parameters.h index 722e55b..a156696 100644 --- a/ios/chrome/app/app_startup_parameters.h +++ b/ios/chrome/app/app_startup_parameters.h
@@ -35,11 +35,11 @@ @property(nonatomic, readonly, assign) const GURL& externalURL; // Original URL that should be opened. May or may not be the same as -// |externalURL|. +// `externalURL`. @property(nonatomic, readonly, assign) const GURL& completeURL; // The list of URLs to open. First URL in the vector is the same -// as |externalURL|. +// as `externalURL`. @property(nonatomic, readonly, assign) const std::vector<GURL>& URLs; // The URL query string parameters in the case that the app was launched as a
diff --git a/ios/chrome/app/application_delegate/app_state.h b/ios/chrome/app/application_delegate/app_state.h index f76342aa..b215eaa 100644 --- a/ios/chrome/app/application_delegate/app_state.h +++ b/ios/chrome/app/application_delegate/app_state.h
@@ -155,7 +155,7 @@ - (void)removeObserver:(id<AppStateObserver>)observer; // Adds a new agent. Agents are owned by the app state. -// This automatically sets the app state on the |agent|. +// This automatically sets the app state on the `agent`. - (void)addAgent:(id<AppStateAgent>)agent; // Removes an agent. - (void)removeAgent:(id<AppStateAgent>)agent;
diff --git a/ios/chrome/app/application_delegate/app_state.mm b/ios/chrome/app/application_delegate/app_state.mm index ada3aa94..fe2c6f63 100644 --- a/ios/chrome/app/application_delegate/app_state.mm +++ b/ios/chrome/app/application_delegate/app_state.mm
@@ -68,7 +68,7 @@ #endif namespace { -// Helper method to post |closure| on the UI thread. +// Helper method to post `closure` on the UI thread. void PostTaskOnUIThread(base::OnceClosure closure) { web::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, std::move(closure)); } @@ -114,7 +114,7 @@ // safe mode. // Depending on the background tasks history, the state of the application is // INITIALIZATION_STAGE_BACKGROUND so this -// step cannot be included in the |startUpBrowserToStage:| method. +// step cannot be included in the `startUpBrowserToStage:` method. - (void)initializeUIPreSafeMode; // Complete the browser initialization for a regular startup. @@ -251,12 +251,13 @@ crash_keys::SetCurrentlyInBackground(true); if (self.initStage < InitStageBrowserObjectsForUI) { - // The clean-up done in |-applicationDidEnterBackground:| is only valid for + // The clean-up done in `-applicationDidEnterBackground:` is only valid for // the case when the application is started in foreground, so there is - // nothing to clean up as the application was not initialized for foreground. + // nothing to clean up as the application was not initialized for + // foreground. // // From the stack trace of the crash bug http://crbug.com/437307 , it - // seems that |-applicationDidEnterBackground:| may be called when the app + // seems that `-applicationDidEnterBackground:` may be called when the app // is started in background and before the initialization for background // stage is done. Note that the crash bug could not be reproduced though. return; @@ -321,7 +322,7 @@ // already the case. This is especially needed for scene startup. if (self.initStage < InitStageBrowserObjectsForUI) { // Start the initialization in the case it wasn't already done before - // foregrounding the app. |initStage| will be greater than InitStageStart if + // foregrounding the app. `initStage` will be greater than InitStageStart if // the initialization was already started. if (self.initStage == InitStageStart) { [self queueTransitionToFirstInitStage]; @@ -476,7 +477,7 @@ [self queueTransitionToFirstInitStage]; // Won't yet initialize the UI at this point when scene startup is supported - // in which case |stateBackground| is true. + // in which case `stateBackground` is true. if (!stateBackground) { [self initializeUIPreSafeMode]; } @@ -630,7 +631,7 @@ // The startup failure count *must* be synchronized now, since the crashes it // is trying to count are during startup. - // -[PreviousSessionInfo beginRecordingCurrentSession] calls |synchronize| on + // -[PreviousSessionInfo beginRecordingCurrentSession] calls `synchronize` on // the user defaults, so leverage that to prevent calling it twice. // Start recording info about this session.
diff --git a/ios/chrome/app/application_delegate/app_state_observer.h b/ios/chrome/app/application_delegate/app_state_observer.h index 29f18f5..52fe033 100644 --- a/ios/chrome/app/application_delegate/app_state_observer.h +++ b/ios/chrome/app/application_delegate/app_state_observer.h
@@ -66,17 +66,17 @@ - (void)appState:(AppState*)appState firstSceneHasInitializedUI:(SceneState*)sceneState; -// Called when |AppState.lastTappedWindow| changes. +// Called when `AppState.lastTappedWindow` changes. - (void)appState:(AppState*)appState lastTappedWindowChanged:(UIWindow*)window; -// Called when the app is about to transition to |nextInitStage|. The init stage -// of the app at that moment is still |nextInitStage| - 1. +// Called when the app is about to transition to `nextInitStage`. The init stage +// of the app at that moment is still `nextInitStage` - 1. - (void)appState:(AppState*)appState willTransitionToInitStage:(InitStage)nextInitStage; // Called right after the app is transitioned out of to the -// |previousInitStage|. he init stage of the app at that -// moment is |previousInitStage| + 1. +// `previousInitStage`. he init stage of the app at that +// moment is `previousInitStage` + 1. - (void)appState:(AppState*)appState didTransitionFromInitStage:(InitStage)previousInitStage;
diff --git a/ios/chrome/app/application_delegate/app_state_unittest.mm b/ios/chrome/app/application_delegate/app_state_unittest.mm index 8f9a5f2..721d4ac6 100644 --- a/ios/chrome/app/application_delegate/app_state_unittest.mm +++ b/ios/chrome/app/application_delegate/app_state_unittest.mm
@@ -73,7 +73,7 @@ @end @interface TestAppState : AppState -// Override |connectedScenes| with a lazily instantiated mutable array. +// Override `connectedScenes` with a lazily instantiated mutable array. @property(nonatomic, strong, readwrite) NSMutableArray<SceneState*>* connectedScenes; @end @@ -148,7 +148,7 @@ // A block ths returns values of AppState connectedScenes. typedef NSArray<SceneState*>* (^ScenesBlock)(id self); -// Sets init stage expected transition calls from |start| to |end|. +// Sets init stage expected transition calls from `start` to `end`. void SetInitStageTransitionExpectations(id mock, AppState* app_state, InitStage start,
diff --git a/ios/chrome/app/application_delegate/memory_warning_helper.mm b/ios/chrome/app/application_delegate/memory_warning_helper.mm index 34559b683..349e94731 100644 --- a/ios/chrome/app/application_delegate/memory_warning_helper.mm +++ b/ios/chrome/app/application_delegate/memory_warning_helper.mm
@@ -43,7 +43,7 @@ ++_foregroundMemoryWarningCount; // Register that we might die because of memory. If we are still alive in - // |kOutOfMemoryResetTimeInterval| seconds, reset the flag. + // `kOutOfMemoryResetTimeInterval` seconds, reset the flag. [[PreviousSessionInfo sharedInstance] setMemoryWarningFlag]; _outOfMemoryResetTime = CFAbsoluteTimeGetCurrent() + kOutOfMemoryResetTimeInterval;
diff --git a/ios/chrome/app/application_delegate/memory_warning_helper_unittest.mm b/ios/chrome/app/application_delegate/memory_warning_helper_unittest.mm index 718a21d..0ae07fad 100644 --- a/ios/chrome/app/application_delegate/memory_warning_helper_unittest.mm +++ b/ios/chrome/app/application_delegate/memory_warning_helper_unittest.mm
@@ -26,9 +26,9 @@ protected: MemoryWarningHelperTest() { - // Set up |memory_pressure_listener_| to invoke |OnMemoryPressure| which + // Set up `memory_pressure_listener_` to invoke `OnMemoryPressure` which // will store the memory pressure level sent to the callback in - // |memory_pressure_level_| so that tests can verify the level is correct. + // `memory_pressure_level_` so that tests can verify the level is correct. memory_pressure_listener_.reset(new base::MemoryPressureListener( FROM_HERE, base::BindRepeating(&MemoryWarningHelperTest::OnMemoryPressure, @@ -48,7 +48,7 @@ return memory_helper_; } - // Callback for |memory_pressure_listener_|. + // Callback for `memory_pressure_listener_`. void OnMemoryPressure( base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { memory_pressure_level_ = memory_pressure_level;
diff --git a/ios/chrome/app/application_delegate/metric_kit_subscriber.mm b/ios/chrome/app/application_delegate/metric_kit_subscriber.mm index 85c3e8a9..0511f86 100644 --- a/ios/chrome/app/application_delegate/metric_kit_subscriber.mm +++ b/ios/chrome/app/application_delegate/metric_kit_subscriber.mm
@@ -265,7 +265,7 @@ // (10ms) they are reported using a representative value of the bucket. // DCHECK on the size of the bucket to detect if the resolution decrease. - // Time based MXHistogram report their values using |UnitDuration| which has + // Time based MXHistogram report their values using `UnitDuration` which has // seconds as base unit. Hence, start and end are given in seconds. double start = [bucket.bucketStart @@ -334,7 +334,7 @@ } - (void)processPayload:(MXMetricPayload*)payload { - // TODO(crbug.com/1140474): See related bug for why |bundleVersion| comes from + // TODO(crbug.com/1140474): See related bug for why `bundleVersion` comes from // mainBundle instead of from version_info::GetVersionNumber(). Remove once // iOS 14.2 reaches mass adoption. NSString* bundleVersion =
diff --git a/ios/chrome/app/application_delegate/metrics_mediator.h b/ios/chrome/app/application_delegate/metrics_mediator.h index 345659f..7cd3e97 100644 --- a/ios/chrome/app/application_delegate/metrics_mediator.h +++ b/ios/chrome/app/application_delegate/metrics_mediator.h
@@ -44,7 +44,7 @@ // Starts or stops the metrics service and crash report recording and/or // uploading, based on the current user preferences. Must be // called both on initialization and after user triggered preference change. -// |isUserTriggered| is used to distinguish between those cases. +// `isUserTriggered` is used to distinguish between those cases. - (void)updateMetricsStateBasedOnPrefsUserTriggered:(BOOL)isUserTriggered; // Logs the duration of the cold start startup. Does nothing if there isn't a // cold start.
diff --git a/ios/chrome/app/application_delegate/mock_metrickit_metric_payload.mm b/ios/chrome/app/application_delegate/mock_metrickit_metric_payload.mm index a6fe398..a3edeb5 100644 --- a/ios/chrome/app/application_delegate/mock_metrickit_metric_payload.mm +++ b/ios/chrome/app/application_delegate/mock_metrickit_metric_payload.mm
@@ -17,7 +17,7 @@ #endif id MockMXMetadata() { - // TODO(crbug.com/1140474): See related bug for why |bundleVersion| comes from + // TODO(crbug.com/1140474): See related bug for why `bundleVersion` comes from // mainBundle instead of from version_info::GetVersionNumber(). Remove once // iOS 14.2 reaches mass adoption. NSString* bundleVersion =
diff --git a/ios/chrome/app/application_delegate/tab_opening.h b/ios/chrome/app/application_delegate/tab_opening.h index ca7624ea..b8b3e412 100644 --- a/ios/chrome/app/application_delegate/tab_opening.h +++ b/ios/chrome/app/application_delegate/tab_opening.h
@@ -20,9 +20,9 @@ // Protocol for object that can open new tabs during application launch. @protocol TabOpening<NSObject> -// Dismisses any modal view, excluding the omnibox if |dismissOmnibox| is NO, -// then opens either a normal or incognito tab with |url|. After opening |url|, -// run completion |handler| if it is not nil. After Tab is opened the virtual +// Dismisses any modal view, excluding the omnibox if `dismissOmnibox` is NO, +// then opens either a normal or incognito tab with `url`. After opening `url`, +// run completion `handler` if it is not nil. After Tab is opened the virtual // URL is set to the pending navigation item. - (void)dismissModalsAndOpenSelectedTabInMode: (ApplicationModeForTabOpening)targetMode @@ -31,9 +31,9 @@ dismissOmnibox:(BOOL)dismissOmnibox completion:(ProceduralBlock)completion; -// Dismisses any modal view, excluding the omnibox if |dismissOmnibox| is NO, -// then opens the list of URLs in |URLs| in either normal or incognito. -// After opening the array of URLs, run completion |handler| if it not nil. +// Dismisses any modal view, excluding the omnibox if `dismissOmnibox` is NO, +// then opens the list of URLs in `URLs` in either normal or incognito. +// After opening the array of URLs, run completion `handler` if it not nil. - (void)dismissModalsAndOpenMultipleTabsInMode: (ApplicationModeForTabOpening)targetMode URLs:(const std::vector<GURL>&)URLs @@ -51,12 +51,12 @@ // Returns a block that can be executed on the new tab to trigger one of the // commands. This block can be passed to -// |dismissModalsAndOpenSelectedTabInMode:withURL:transition:completion:|. +// `dismissModalsAndOpenSelectedTabInMode:withURL:transition:completion:`. // This block must only be executed if new tab opened on NTP. - (ProceduralBlock)completionBlockForTriggeringAction: (NTPTabOpeningPostOpeningAction)action; -// Whether the |URL| is already opened, in regular mode. +// Whether the `URL` is already opened, in regular mode. - (BOOL)URLIsOpenedInRegularMode:(const GURL&)URL; @end
diff --git a/ios/chrome/app/application_delegate/url_opener.mm b/ios/chrome/app/application_delegate/url_opener.mm index 2a21bf7..0c9da79 100644 --- a/ios/chrome/app/application_delegate/url_opener.mm +++ b/ios/chrome/app/application_delegate/url_opener.mm
@@ -82,8 +82,8 @@ GURL URL; GURL virtualURL; if ([params completeURL].SchemeIsFile()) { - // External URL will be loaded by WebState, which expects |completeURL|. - // Omnibox however suppose to display |externalURL|, which is used as + // External URL will be loaded by WebState, which expects `completeURL`. + // Omnibox however suppose to display `externalURL`, which is used as // virtual URL. URL = [params completeURL]; virtualURL = [params externalURL]; @@ -131,7 +131,7 @@ // This method is always called when the SceneState transitions to // SceneActivationLevelForegroundActive, and before the handling of // startupInformation is done. - // Pass |NO| as active to avoid double processing. + // Pass `NO` as active to avoid double processing. [URLOpener openURL:options applicationActive:NO tabOpener:tabOpener
diff --git a/ios/chrome/app/application_delegate/url_opener_params.h b/ios/chrome/app/application_delegate/url_opener_params.h index aeefdcb..205dedc 100644 --- a/ios/chrome/app/application_delegate/url_opener_params.h +++ b/ios/chrome/app/application_delegate/url_opener_params.h
@@ -29,12 +29,12 @@ // The init method for the UIWindowSceneDelegate format. - (instancetype)initWithUIOpenURLContext:(UIOpenURLContext*)context; -// The init method for the |UIApplicationDelegate -// application:didFinishLaunchingWithOptions:| format. +// The init method for the `UIApplicationDelegate +// application:didFinishLaunchingWithOptions:` format. - (instancetype)initWithLaunchOptions:(NSDictionary*)options; -// Converts to the |UIApplicationDelegate -// application:didFinishLaunchingWithOptions:|. +// Converts to the `UIApplicationDelegate +// application:didFinishLaunchingWithOptions:`. - (NSDictionary*)toLaunchOptions; @end
diff --git a/ios/chrome/app/application_delegate/url_opener_unittest.mm b/ios/chrome/app/application_delegate/url_opener_unittest.mm index 639fd20..80f8fc7d 100644 --- a/ios/chrome/app/application_delegate/url_opener_unittest.mm +++ b/ios/chrome/app/application_delegate/url_opener_unittest.mm
@@ -138,7 +138,7 @@ @"com.google.SomeOtherProduct", @"com.apple.mobilesafari", @"com.othercompany.otherproduct" ]; - // See documentation for |annotation| property in + // See documentation for `annotation` property in // UIDocumentInteractionstartupInformation Class Reference. The following // values are mostly to detect garbage-in situations and ensure that the app // won't crash or garbage out.
diff --git a/ios/chrome/app/application_delegate/user_activity_handler.h b/ios/chrome/app/application_delegate/user_activity_handler.h index cbcbc9d..aa7ff8b 100644 --- a/ios/chrome/app/application_delegate/user_activity_handler.h +++ b/ios/chrome/app/application_delegate/user_activity_handler.h
@@ -26,7 +26,7 @@ // tab or setup startupParameters to open it later. If a new tab must be // opened immediately (e.g. if a Siri Shortcut was triggered by the user while // Chrome was already in the foreground), it will be done with the provided -// |browserState|. Returns wether it could continue userActivity. +// `browserState`. Returns wether it could continue userActivity. + (BOOL)continueUserActivity:(NSUserActivity*)userActivity applicationIsActive:(BOOL)applicationIsActive tabOpener:(id<TabOpening>)tabOpener @@ -36,7 +36,7 @@ initStage:(InitStage)initStage; // Handles the 3D touch application static items. If the First Run UI is active, -// |completionHandler| will be called with NO. +// `completionHandler` will be called with NO. + (void)performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem completionHandler:(void (^)(BOOL succeeded))completionHandler tabOpener:(id<TabOpening>)tabOpener
diff --git a/ios/chrome/app/application_delegate/user_activity_handler.mm b/ios/chrome/app/application_delegate/user_activity_handler.mm index ef15519a..91c3bcf0 100644 --- a/ios/chrome/app/application_delegate/user_activity_handler.mm +++ b/ios/chrome/app/application_delegate/user_activity_handler.mm
@@ -224,7 +224,7 @@ std::vector<GURL> URLs; if ([intent.url isKindOfClass:[NSURL class]]) { - // Old intent version where |url| is of type NSURL rather than an array. + // Old intent version where `url` is of type NSURL rather than an array. GURL webpageGURL( net::GURLWithNSURL(base::mac::ObjCCastStrict<NSURL>(intent.url))); if (!webpageGURL.is_valid()) @@ -357,8 +357,8 @@ BOOL dismissOmnibox = [[connectionInformation startupParameters] postOpeningAction] != FOCUS_OMNIBOX; - // Using a weak reference to |connectionInformation| to solve a memory leak - // issue. |tabOpener| and |connectionInformation| are the same object in + // Using a weak reference to `connectionInformation` to solve a memory leak + // issue. `tabOpener` and `connectionInformation` are the same object in // some cases (SceneController). This retains the object while the block // exists. Then this block is passed around and in some cases it ends up // stored in BrowserViewController. This results in a memory leak that looks @@ -514,7 +514,7 @@ // The app is already active so the applicationDidBecomeActive: method // will never be called. Open the requested URL after all modal UIs have - // been dismissed. |_startupParameters| must be retained until all deferred + // been dismissed. `_startupParameters` must be retained until all deferred // modal UIs are dismissed and tab opened with requested URL. ApplicationModeForTabOpening targetMode = [[connectionInformation startupParameters] applicationMode]; @@ -522,8 +522,8 @@ GURL virtualURL; GURL completeURL = connectionInformation.startupParameters.completeURL; if (completeURL.SchemeIsFile()) { - // External URL will be loaded by WebState, which expects |completeURL|. - // Omnibox however suppose to display |externalURL|, which is used as + // External URL will be loaded by WebState, which expects `completeURL`. + // Omnibox however suppose to display `externalURL`, which is used as // virtual URL. URL = completeURL; virtualURL = externalURL;
diff --git a/ios/chrome/app/credential_provider_migrator_app_agent.mm b/ios/chrome/app/credential_provider_migrator_app_agent.mm index 44528cd..3d7d731 100644 --- a/ios/chrome/app/credential_provider_migrator_app_agent.mm +++ b/ios/chrome/app/credential_provider_migrator_app_agent.mm
@@ -19,7 +19,7 @@ @interface CredentialProviderAppAgent () -// |migrator| is in charge of migrating the password when Chrome comes to +// `migrator` is in charge of migrating the password when Chrome comes to // foreground. @property(nonatomic, strong) CredentialProviderMigrator* migrator;
diff --git a/ios/chrome/app/deferred_initialization_runner.h b/ios/chrome/app/deferred_initialization_runner.h index bc802bf..9110890 100644 --- a/ios/chrome/app/deferred_initialization_runner.h +++ b/ios/chrome/app/deferred_initialization_runner.h
@@ -21,17 +21,17 @@ // Returns singleton instance. + (DeferredInitializationRunner*)sharedInstance; -// Stores |block| under |name| to a queue of blocks to run. All blocks are run +// Stores `block` under `name` to a queue of blocks to run. All blocks are run // sequentially with a small delay before the first block and between each -// successive block. If a block is already registered under |name|, it is -// replaced with |block| unless it has already been run. +// successive block. If a block is already registered under `name`, it is +// replaced with `block` unless it has already been run. - (void)enqueueBlockNamed:(NSString*)name block:(ProceduralBlock)block; -// Looks up a previously scheduled block of |name|. If block has not been +// Looks up a previously scheduled block of `name`. If block has not been // run yet, run it synchronously now. - (void)runBlockIfNecessary:(NSString*)name; -// Cancels a previously scheduled block of |name|. This is a no-op if the +// Cancels a previously scheduled block of `name`. This is a no-op if the // block has already been executed. - (void)cancelBlockNamed:(NSString*)name; @@ -47,7 +47,7 @@ @property(nonatomic, assign) NSTimeInterval delayBetweenBlocks; // Time interval before running the first block. To override default value of -// 3s, set this property before the first call to |-enqueueBlockNamed:block:|. +// 3s, set this property before the first call to `-enqueueBlockNamed:block:`. @property(nonatomic, assign) NSTimeInterval delayBeforeFirstBlock; @end
diff --git a/ios/chrome/app/deferred_initialization_runner.mm b/ios/chrome/app/deferred_initialization_runner.mm index f7e76f30..45d179e 100644 --- a/ios/chrome/app/deferred_initialization_runner.mm +++ b/ios/chrome/app/deferred_initialization_runner.mm
@@ -70,8 +70,8 @@ BOOL _isBlockScheduled; } -// Schedule the next block to be run after |delay| it will automatically -// schedule the next block after |delayBetweenBlocks|. +// Schedule the next block to be run after `delay` it will automatically +// schedule the next block after `delayBetweenBlocks`. - (void)scheduleNextBlockWithDelay:(NSTimeInterval)delay; // Time interval between two blocks. Default value is 200ms.
diff --git a/ios/chrome/app/deferred_initialization_runner_unittest.mm b/ios/chrome/app/deferred_initialization_runner_unittest.mm index 99fb39b..5eaa806b 100644 --- a/ios/chrome/app/deferred_initialization_runner_unittest.mm +++ b/ios/chrome/app/deferred_initialization_runner_unittest.mm
@@ -162,7 +162,7 @@ [runner enqueueBlockNamed:@"multiple" block:runBlock]; [runner enqueueBlockNamed:@"multiple" block:runBlock]; - // Test: |runBlock| was executed only once. + // Test: `runBlock` was executed only once. EXPECT_EQ(1U, [runner numberOfBlocksRemaining]); [runner runBlockIfNecessary:@"multiple"]; EXPECT_EQ(0U, [runner numberOfBlocksRemaining]);
diff --git a/ios/chrome/app/enterprise_app_agent.mm b/ios/chrome/app/enterprise_app_agent.mm index f74a507..7f63587 100644 --- a/ios/chrome/app/enterprise_app_agent.mm +++ b/ios/chrome/app/enterprise_app_agent.mm
@@ -192,12 +192,12 @@ - (BOOL)shouldShowEnterpriseLoadScreen { self.policyConnector = GetApplicationContext()->GetBrowserPolicyConnector(); - // |policyConnector| is nullptr if policy is not enabled. + // `policyConnector` is nullptr if policy is not enabled. if (!self.policyConnector) { return NO; } - // |machineLevelUserCloudPolicyManager| is nullptr if the DM token needed + // `machineLevelUserCloudPolicyManager` is nullptr if the DM token needed // for fetch is explicitly invalid or if enrollment tokens and DM token are // empty. policy::MachineLevelUserCloudPolicyManager*
diff --git a/ios/chrome/app/first_run_app_state_agent.mm b/ios/chrome/app/first_run_app_state_agent.mm index 7a8c8a0..1613d0e2 100644 --- a/ios/chrome/app/first_run_app_state_agent.mm +++ b/ios/chrome/app/first_run_app_state_agent.mm
@@ -114,7 +114,7 @@ [self handleFirstRunStage]; } // Important: do not add code after this block because its purpose is to - // clear |self| when not needed anymore. + // clear `self` when not needed anymore. if (previousInitStage == InitStageFirstRun) { // Nothing left to do; clean up. [self.appState removeAgent:self];
diff --git a/ios/chrome/app/main_application_delegate.mm b/ios/chrome/app/main_application_delegate.mm index bd494bc..51a901a 100644 --- a/ios/chrome/app/main_application_delegate.mm +++ b/ios/chrome/app/main_application_delegate.mm
@@ -136,7 +136,7 @@ } - (void)applicationWillTerminate:(UIApplication*)application { - // If |self.didFinishLaunching| is NO, that indicates that the app was + // If `self.didFinishLaunching` is NO, that indicates that the app was // terminated before startup could be run. In this situation, skip running // shutdown, since the app was never fully started. if (!self.didFinishLaunching) @@ -234,7 +234,7 @@ } - (void)lastSceneDidEnterBackground:(NSNotification*)notification { - // Reset |startupHadExternalIntent| for all Scenes in case external intents + // Reset `startupHadExternalIntent` for all Scenes in case external intents // were triggered while the application was in the foreground. for (SceneState* scene in self.appState.connectedScenes) { if (scene.startupHadExternalIntent) {
diff --git a/ios/chrome/app/main_application_delegate_unittest.mm b/ios/chrome/app/main_application_delegate_unittest.mm index e8f5a5e..6c556c2 100644 --- a/ios/chrome/app/main_application_delegate_unittest.mm +++ b/ios/chrome/app/main_application_delegate_unittest.mm
@@ -18,8 +18,8 @@ using MainApplicationDelegateTest = PlatformTest; -// Tests that the application does not crash if |applicationWillTerminate:| is -// called before a previous call to |application:didFinishLaunchingWithOptions:| +// Tests that the application does not crash if `applicationWillTerminate:` is +// called before a previous call to `application:didFinishLaunchingWithOptions:` // set up the ChromeBrowserProvider. This can happen if the app is force-quit // while the splash screen is still visible. TEST_F(MainApplicationDelegateTest, TerminateCalledWithNoBrowserProvider) {
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index f5a9c02..50cbaaaa 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -495,7 +495,7 @@ _browserStateManager->GetLastUsedBrowserState(); // The CrashRestoreHelper must clean up the old browser state information. - // |self.restoreHelper| must be kept alive until the BVC receives the + // `self.restoreHelper` must be kept alive until the BVC receives the // browser state. BOOL needRestoration = NO; if (isPostCrashLaunch) { @@ -643,7 +643,7 @@ break; case InitStageBrowserObjectsForUI: // When adding a new initialization flow, consider setting - // |_appState.userInteracted| at the appropriate time. + // `_appState.userInteracted` at the appropriate time. DCHECK(_appState.userInteracted); [self startUpBrowserForegroundInitialization]; [appState queueTransitionToNextInitStage]; @@ -946,7 +946,7 @@ }]; } -// Schedule a call to |saveFieldTrialValuesForExtensions| for deferred +// Schedule a call to `saveFieldTrialValuesForExtensions` for deferred // execution. - (void)scheduleSaveFieldTrialValuesForExtensions { [[DeferredInitializationRunner sharedInstance] @@ -997,7 +997,7 @@ forKey:app_group::kChromeExtensionFieldTrialPreference]; } -// Schedules a call to |logIfEnterpriseManagedDevice| for deferred +// Schedules a call to `logIfEnterpriseManagedDevice` for deferred // execution. - (void)scheduleEnterpriseManagedDeviceCheck { [[DeferredInitializationRunner sharedInstance] @@ -1109,7 +1109,7 @@ - (void)expireFirstUserActionRecorder { // Clear out any scheduled calls to this method. For example, the app may have - // been backgrounded before the |kFirstUserActionTimeout| expired. + // been backgrounded before the `kFirstUserActionTimeout` expired. [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector( @@ -1221,7 +1221,7 @@ disableWebUsageDuringRemoval = NO; for (SceneState* sceneState in self.appState.connectedScenes) { - // Assumes all scenes share |browserState|. + // Assumes all scenes share `browserState`. id<BrowserInterfaceProvider> sceneInterface = sceneState.interfaceProvider; if (disableWebUsageDuringRemoval) { // Disables browsing and purges web views. @@ -1247,7 +1247,7 @@ // Must be called only on the main thread. DCHECK([NSThread isMainThread]); for (SceneState* sceneState in self.appState.connectedScenes) { - // Assumes all scenes share |browserState|. + // Assumes all scenes share `browserState`. id<BrowserInterfaceProvider> sceneInterface = sceneState.interfaceProvider; @@ -1268,7 +1268,7 @@ sceneInterface.incognitoInterface.userInteractionEnabled = YES; [sceneInterface.currentInterface setPrimary:YES]; } - // |completionBlock is run once, not once per scene. + // `completionBlock` is run once, not once per scene. if (completionBlock) completionBlock(); };
diff --git a/ios/chrome/app/memory_monitor.mm b/ios/chrome/app/memory_monitor.mm index 76f9fb7..e8242bb 100644 --- a/ios/chrome/app/memory_monitor.mm +++ b/ios/chrome/app/memory_monitor.mm
@@ -24,7 +24,7 @@ #endif namespace { -// Delay between each invocations of |UpdateMemoryValues|. +// Delay between each invocations of `UpdateMemoryValues`. const int64_t kMemoryMonitorDelayInSeconds = 30; // Checks the values of free RAM and free disk space and updates breakpad with @@ -56,8 +56,8 @@ }); } -// Invokes |UpdateMemoryValues| and schedules itself to be called after -// |kMemoryMonitorDelayInSeconds|. +// Invokes `UpdateMemoryValues` and schedules itself to be called after +// `kMemoryMonitorDelayInSeconds`. void AsynchronousFreeMemoryMonitor() { UpdateMemoryValues(); base::ThreadPool::PostDelayedTask(
diff --git a/ios/chrome/app/safe_mode_app_state_agent_unittest.mm b/ios/chrome/app/safe_mode_app_state_agent_unittest.mm index 40abedcd..69a2bf91b 100644 --- a/ios/chrome/app/safe_mode_app_state_agent_unittest.mm +++ b/ios/chrome/app/safe_mode_app_state_agent_unittest.mm
@@ -50,8 +50,8 @@ didTransitionFromInitStage:(InitStage)previousInitStage; @end -// Iterate through the init stages from |startInitStage| up to -// |initStageDestination|. +// Iterate through the init stages from `startInitStage` up to +// `initStageDestination`. void IterateToStage(InitStage startInitStage, InitStage initStageDestination, SafeModeAppAgent* agent,
diff --git a/ios/chrome/app/spotlight/actions_spotlight_manager.h b/ios/chrome/app/spotlight/actions_spotlight_manager.h index 67f0acb..4e878ced 100644 --- a/ios/chrome/app/spotlight/actions_spotlight_manager.h +++ b/ios/chrome/app/spotlight/actions_spotlight_manager.h
@@ -18,8 +18,8 @@ extern const char kSpotlightActionQRScanner[]; // Sets the correct properties for startup parameters according to the action -// specified by the |query|. Returns YES if the properties were successfully -// set. The query must represent an action and |startupParams| must not be nil. +// specified by the `query`. Returns YES if the properties were successfully +// set. The query must represent an action and `startupParams` must not be nil. BOOL SetStartupParametersForSpotlightAction( NSString* query, AppStartupParameters* startupParams);
diff --git a/ios/chrome/app/spotlight/actions_spotlight_manager.mm b/ios/chrome/app/spotlight/actions_spotlight_manager.mm index 3fa0055b..977fcb2 100644 --- a/ios/chrome/app/spotlight/actions_spotlight_manager.mm +++ b/ios/chrome/app/spotlight/actions_spotlight_manager.mm
@@ -53,7 +53,7 @@ // Recorded when a user pressed the QR scanner spotlight action. SPOTLIGHT_ACTION_QR_CODE_SCANNER_PRESSED, // NOTE: Add new spotlight actions in sources only immediately above this - // line. Also, make sure the enum list for histogram |SpotlightActions| in + // line. Also, make sure the enum list for histogram `SpotlightActions` in // histograms.xml is updated with any change in here. SPOTLIGHT_ACTION_COUNT }; @@ -99,7 +99,7 @@ @interface ActionsSpotlightManager () -// Creates a new Spotlight entry with title |title| for the given |action|. +// Creates a new Spotlight entry with title `title` for the given `action`. - (CSSearchableItem*)itemForAction:(NSString*)action title:(NSString*)title; // Clears and re-inserts all Spotlight actions.
diff --git a/ios/chrome/app/spotlight/base_spotlight_manager.h b/ios/chrome/app/spotlight/base_spotlight_manager.h index 32ff1033..e05d2fee 100644 --- a/ios/chrome/app/spotlight/base_spotlight_manager.h +++ b/ios/chrome/app/spotlight/base_spotlight_manager.h
@@ -25,18 +25,18 @@ - (instancetype)init NS_UNAVAILABLE; -// Refreshes all items that point to |URLToRefresh|, using title |title|, by -// calling spotlightItemsWithURL on given URL. The values of |title| and |URL| +// Refreshes all items that point to `URLToRefresh`, using title `title`, by +// calling spotlightItemsWithURL on given URL. The values of `title` and `URL` // will be passed to spotlightItemsWithURL. - (void)refreshItemsWithURL:(const GURL&)URLToRefresh title:(NSString*)title; -// Creates a spotlight item with |itemID|, using the |attributeSet|. +// Creates a spotlight item with `itemID`, using the `attributeSet`. - (CSSearchableItem*)spotlightItemWithItemID:(NSString*)itemID attributeSet: (CSSearchableItemAttributeSet*)attributeSet; -// Creates spotlight items in the class's domain for |URL|, -// using |favicon| and |defaultTitle| +// Creates spotlight items in the class's domain for `URL`, +// using `favicon` and `defaultTitle` // Base implementation creates a single item directly using provided arguments // and expects a non-nil title. - (NSArray*)spotlightItemsWithURL:(const GURL&)URL @@ -44,13 +44,13 @@ defaultTitle:(NSString*)defaultTitle; // Removes all items in the current manager's domain from the Spotlight -// index, then calls |callback| on completion +// index, then calls `callback` on completion - (void)clearAllSpotlightItems:(BlockWithError)callback; // Cancel all large icon pending tasks. - (void)cancelAllLargeIconPendingTasks; -// Returns the spotlight ID for an item indexing |URL| and |title|. +// Returns the spotlight ID for an item indexing `URL` and `title`. - (NSString*)spotlightIDForURL:(const GURL&)URL title:(NSString*)title; // Returns the number of pending large icon query tasks
diff --git a/ios/chrome/app/spotlight/base_spotlight_manager.mm b/ios/chrome/app/spotlight/base_spotlight_manager.mm index b43e9ad..efe9646 100644 --- a/ios/chrome/app/spotlight/base_spotlight_manager.mm +++ b/ios/chrome/app/spotlight/base_spotlight_manager.mm
@@ -44,8 +44,8 @@ // Radius of the rounded corner of the fallback icon. const CGFloat kFallbackRoundedCorner = 8; -// Create an image with a rounded square with color |backgroundColor| and -// |string| centered in color |textColor|. +// Create an image with a rounded square with color `backgroundColor` and +// `string` centered in color `textColor`. UIImage* GetFallbackImageWithStringAndColor(NSString* string, UIColor* backgroundColor, UIColor* textColor) { @@ -97,7 +97,7 @@ } // Compute a hash consisting of the first 8 bytes of the MD5 hash of a string -// containing |URL| and |title|. +// containing `URL` and `title`. - (int64_t)hashForURL:(const GURL&)URL title:(NSString*)title; // Returns an array of Keywords for Spotlight search.
diff --git a/ios/chrome/app/spotlight/bookmarks_spotlight_manager.h b/ios/chrome/app/spotlight/bookmarks_spotlight_manager.h index 4991ac98a..5f3fbbd 100644 --- a/ios/chrome/app/spotlight/bookmarks_spotlight_manager.h +++ b/ios/chrome/app/spotlight/bookmarks_spotlight_manager.h
@@ -47,7 +47,7 @@ - (void)getParentKeywordsForNode:(const bookmarks::BookmarkNode*)node inArray:(NSMutableArray*)keywords; -// Adds keywords to |item|. +// Adds keywords to `item`. - (void)addKeywords:(NSArray*)keywords toSearchableItem:(CSSearchableItem*)item; // Called before the instance is deallocated. This method should be overridden
diff --git a/ios/chrome/app/spotlight/bookmarks_spotlight_manager.mm b/ios/chrome/app/spotlight/bookmarks_spotlight_manager.mm index 2528d9f..279c8ec3 100644 --- a/ios/chrome/app/spotlight/bookmarks_spotlight_manager.mm +++ b/ios/chrome/app/spotlight/bookmarks_spotlight_manager.mm
@@ -41,7 +41,7 @@ // Keep a reference to detach before deallocing. Life cycle of _bookmarkModel // is longer than life cycle of a SpotlightManager as - // |BookmarkModelBeingDeleted| will cause deletion of SpotlightManager. + // `BookmarkModelBeingDeleted` will cause deletion of SpotlightManager. bookmarks::BookmarkModel* _bookmarkModel; // weak // Number of nodes indexed in initial scan. @@ -51,7 +51,7 @@ BOOL _initialIndexDone; } -// Detaches the |SpotlightBookmarkModelBridge| from the bookmark model. The +// Detaches the `SpotlightBookmarkModelBridge` from the bookmark model. The // manager must not be used after calling this method. - (void)detachBookmarkModel; @@ -63,7 +63,7 @@ - (void)clearAndReindexModel; // Refreshes all nodes in the subtree of node. -// If |initial| is YES, limit the number of nodes to kMaxInitialIndexSize. +// If `initial` is YES, limit the number of nodes to kMaxInitialIndexSize. - (void)refreshNodeInIndex:(const bookmarks::BookmarkNode*)node initial:(BOOL)initial;
diff --git a/ios/chrome/app/spotlight/spotlight_manager.h b/ios/chrome/app/spotlight/spotlight_manager.h index e54a626..bdfe499 100644 --- a/ios/chrome/app/spotlight/spotlight_manager.h +++ b/ios/chrome/app/spotlight/spotlight_manager.h
@@ -9,7 +9,7 @@ class ChromeBrowserState; -// Allows Chrome to add the bookmarks of |bookmarkModel| in the systemwide +// Allows Chrome to add the bookmarks of `bookmarkModel` in the systemwide // Spotlight search index. // Bookmarks are added, removed or updated in Spotlight based on // BookmarkModelObserver notification. @@ -21,8 +21,8 @@ // Creates a SpotlightManager tracking and indexing various browser state // elements such as most actives and bookmarks. -// |browserState| must not be nil. -// There should be only one SpotlightManager observing |browserState|. +// `browserState` must not be nil. +// There should be only one SpotlightManager observing `browserState`. + (SpotlightManager*)spotlightManagerWithBrowserState: (ChromeBrowserState*)browserState;
diff --git a/ios/chrome/app/spotlight/spotlight_util.h b/ios/chrome/app/spotlight/spotlight_util.h index b2079bb..b1e53b9c 100644 --- a/ios/chrome/app/spotlight/spotlight_util.h +++ b/ios/chrome/app/spotlight/spotlight_util.h
@@ -35,7 +35,7 @@ // The current version of the Spotlight index format. // Change this value if there are change int the information indexed in // Spotlight. This will force reindexation on next startup. -// Value is stored in |kSpotlightLastIndexingVersionKey|. +// Value is stored in `kSpotlightLastIndexingVersionKey`. extern const int kCurrentSpotlightIndexVersion; // NSUserDefault key of entry containing Chrome version of the latest bookmarks @@ -60,14 +60,14 @@ // Clears the current Spotlight index of the device. Method is static to allow // clearing the index without instantiating SpotlightManager. -// This method must not be called if |isSpotlightAvailable| returns NO. +// This method must not be called if `isSpotlightAvailable` returns NO. // This method is asynchronous and can fail. Completion is called with a // parameter indicating if the deletion was a success. void ClearSpotlightIndexWithCompletion(BlockWithError completion); -// Finds the Spoglight itemID and calls |completion| with the corresponding URL. -// Calls |completion| with nil if none was found. -// |completion| is called on the Spotlight Thread. +// Finds the Spoglight itemID and calls `completion` with the corresponding URL. +// Calls `completion` with nil if none was found. +// `completion` is called on the Spotlight Thread. void GetURLForSpotlightItemID(NSString* itemID, BlockWithNSURL completion) API_AVAILABLE(ios(10.0));
diff --git a/ios/chrome/app/spotlight/spotlight_util.mm b/ios/chrome/app/spotlight/spotlight_util.mm index 48c477f7e..9164c35 100644 --- a/ios/chrome/app/spotlight/spotlight_util.mm +++ b/ios/chrome/app/spotlight/spotlight_util.mm
@@ -101,7 +101,7 @@ // The current version of the Spotlight index format. // Change this value if there are change int the information indexed in // Spotlight. This will force reindexation on next startup. -// Value is stored in |kSpotlightLastIndexingVersionKey|. +// Value is stored in `kSpotlightLastIndexingVersionKey`. const int kCurrentSpotlightIndexVersion = 3; Domain SpotlightDomainFromString(NSString* domain) {
diff --git a/ios/chrome/app/startup/chrome_app_startup_parameters.h b/ios/chrome/app/startup/chrome_app_startup_parameters.h index ae10c1c..72e3f9e 100644 --- a/ios/chrome/app/startup/chrome_app_startup_parameters.h +++ b/ios/chrome/app/startup/chrome_app_startup_parameters.h
@@ -50,7 +50,7 @@ NS_DESIGNATED_INITIALIZER; // Returns a ChromeAppStartupParameters instance containing the URL to -// open (|externalURL|). In case the URL is conforming to the x-callback-url +// open (`externalURL`). In case the URL is conforming to the x-callback-url // specification, additional information are stored in the returned value. // // The forms of the URLs we expect are: @@ -81,7 +81,7 @@ // - x-<protocol>://x-callback-url/<action>?url=<url/goes/here> // This forms is compliant with x-callback-url (x-callback-url.com). // Currently the only action supported for external application is "open" and -// the only required parameter is |url| containing the url to open inclusive +// the only required parameter is `url` containing the url to open inclusive // of protocol. // For application members of the Chrome Application Group, // "app-group-command" command can be used. In that case, the paramaters are
diff --git a/ios/chrome/app/startup/chrome_app_startup_parameters.mm b/ios/chrome/app/startup/chrome_app_startup_parameters.mm index 0f533d4..421f861 100644 --- a/ios/chrome/app/startup/chrome_app_startup_parameters.mm +++ b/ios/chrome/app/startup/chrome_app_startup_parameters.mm
@@ -264,7 +264,7 @@ UMA_HISTOGRAM_ENUMERATION(kUMAMobileSessionStartActionHistogram, START_ACTION_OPEN_FILE, MOBILE_SESSION_START_ACTION_COUNT); - // |url| is the path to a file received from another application. + // `url` is the path to a file received from another application. GURL::Replacements replacements; const std::string host(kChromeUIExternalFileHost); std::string filename = gurl.ExtractFileName(); @@ -292,7 +292,7 @@ base::UserMetricsAction("MobileDefaultBrowserViewIntent")); } else { // Replace the scheme with https or http depending on whether the input - // |url| scheme ends with an 's'. + // `url` scheme ends with an 's'. BOOL useHttps = gurl.scheme()[gurl.scheme().length() - 1] == 's'; action = useHttps ? START_ACTION_OPEN_HTTPS : START_ACTION_OPEN_HTTP; base::RecordAction(base::UserMetricsAction("MobileFirstPartyViewIntent")); @@ -344,7 +344,7 @@ [sharedDefaults removeObjectForKey:commandDictionaryPreference]; - // |sharedDefaults| is used for communication between apps. Synchronize to + // `sharedDefaults` is used for communication between apps. Synchronize to // avoid synchronization issues (like removing the next order). [sharedDefaults synchronize]; @@ -634,11 +634,11 @@ // Takes care of degenerated case of no QUERY_STRING. if (![query length]) return first_run::LAUNCH_BY_MOBILESAFARI; - // Look for |kSmartAppBannerKey| anywhere within the query string. + // Look for `kSmartAppBannerKey` anywhere within the query string. NSRange found = [query rangeOfString:kSmartAppBannerKey]; if (found.location == NSNotFound) return first_run::LAUNCH_BY_MOBILESAFARI; - // |kSmartAppBannerKey| can be at the beginning or end of the query + // `kSmartAppBannerKey` can be at the beginning or end of the query // string and may also be optionally followed by a equal sign and a value. // For now, just look for the presence of the key and ignore the value. if (found.location + found.length < [query length]) {
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 16e081c..dd27ad6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -227,6 +227,7 @@ <translation id="2898963176829412617">Yeni Qovluq...</translation> <translation id="2916171785467530738">Axtarış və Linkləri avtomatik tamamlayın</translation> <translation id="291754862089661335">QR kodu və ya barkodu bu çərçivəyə yerləşdirin</translation> +<translation id="2920866371965792875">Bu saytdan güncəlləmələri görmək üçün onu burada izləyin.</translation> <translation id="2921219216347069551">Səhifəni Paylaşmaq Olmur</translation> <translation id="2923448633003185837">Yerləşdirin və Keçin</translation> <translation id="292639812446257861">Oxunmamış Kimi Qeyd Edin</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index 38f1caf1..0a35599 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -227,6 +227,7 @@ <translation id="2898963176829412617">New Folder…</translation> <translation id="2916171785467530738">Autocomplete searches and URLs</translation> <translation id="291754862089661335">Position QR code or bar code in this frame</translation> +<translation id="2920866371965792875">To see updates from this site, follow it here.</translation> <translation id="2921219216347069551">Cannot Share Page</translation> <translation id="2923448633003185837">Paste and go</translation> <translation id="292639812446257861">Mark Unread</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 3004952..e9ac4ee 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -227,6 +227,7 @@ <translation id="2898963176829412617">ახალი საქაღალდე…</translation> <translation id="2916171785467530738">ძიებებისა და URL-ების ავტომატური დასრულება</translation> <translation id="291754862089661335">მოათავსეთ QR-კოდი ან შტრიხკოდი ამ ჩარჩოში</translation> +<translation id="2920866371965792875">ამ საიტიდან სიახლეების გასაცნობად მიადევნეთ მას თვალი აქ.</translation> <translation id="2921219216347069551">გვერდის გაზიარება შეუძლებელია</translation> <translation id="2923448633003185837">ჩასმა და გადასვლა</translation> <translation id="292639812446257861">წაუკითხავად მონიშვნა</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 77521d6..11905be 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -227,6 +227,7 @@ <translation id="2898963176829412617">ໂຟລເດີໃໝ່...</translation> <translation id="2916171785467530738">ຕື່ມການຊອກຫາ ແລະ URL ໂດຍອັດຕະໂນມັດ</translation> <translation id="291754862089661335">ປັບຕຳແໜ່ງລະຫັດ QR ຫຼື ບາໂຄດໃນເຟຣມນີ້</translation> +<translation id="2920866371965792875">ເພື່ອເບິ່ງອັບເດດຈາກເວັບໄຊນີ້, ໃຫ້ຕິດຕາມມັນຢູ່ບ່ອນນີ້.</translation> <translation id="2921219216347069551">ບໍ່ສາມາດແບ່ງປັນໜ້າໄດ້</translation> <translation id="2923448633003185837">ວາງໃສ່ ແລະ ຊອກຫາ</translation> <translation id="292639812446257861">ໝາຍວ່າຍັງບໍ່ໄດ້ອ່ານ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index e984599a..66c55f07 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -227,6 +227,7 @@ <translation id="2898963176829412617">Naujas aplankas...</translation> <translation id="2916171785467530738">Automatiškai užbaigti paieškas ir URL</translation> <translation id="291754862089661335">QR arba brūkšninis kodas turėtų būti rodomas šiame rėmelyje</translation> +<translation id="2920866371965792875">Jei norite matyti naujienas iš šios svetainės, čia galite pasirinkti ją stebėti.</translation> <translation id="2921219216347069551">Neįman. bendr. pusl.</translation> <translation id="2923448633003185837">Įklijuoti ir eiti</translation> <translation id="292639812446257861">Pažymėti kaip neskaitytus</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 778291d..f91af32 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -227,6 +227,7 @@ <translation id="2898963176829412617">Шинэ хавтас...</translation> <translation id="2916171785467530738">Хайлт болон URL-г автоматаар гүйцээх</translation> <translation id="291754862089661335">Энэ хүрээнд QR код, эсвэл баркод байршуулах</translation> +<translation id="2920866371965792875">Энэ сайтын шинэчлэлтүүдийг үзэхийн тулд энд дагаарай.</translation> <translation id="2921219216347069551">Хуудсыг хуваалцаж чадахгүй байна</translation> <translation id="2923448633003185837">Буулгаад үргэлжлүүлэх</translation> <translation id="292639812446257861">Уншаагүй гэж тэмдэглэх</translation>
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper.h b/ios/chrome/browser/download/ar_quick_look_tab_helper.h index 2fe4c0dd..cdef2ec7 100644 --- a/ios/chrome/browser/download/ar_quick_look_tab_helper.h +++ b/ios/chrome/browser/download/ar_quick_look_tab_helper.h
@@ -13,10 +13,6 @@ @protocol ARQuickLookTabHelperDelegate; -namespace base { -class FilePath; -} // namespace base - namespace web { class DownloadTask; class WebState; @@ -89,17 +85,13 @@ // web::DownloadTaskObserver: void OnDownloadUpdated(web::DownloadTask* download_task) override; - // Asynchronously starts download operation in |destination_dir|. - void DownloadWithDestinationDir(const base::FilePath& destination_dir, - web::DownloadTask* download_task, - bool directory_created); - // Previews the downloaded USDZ file or confirms the download if download has // not started. void ConfirmOrPreviewDownload(web::DownloadTask* download_task); web::WebState* web_state_ = nullptr; __weak id<ARQuickLookTabHelperDelegate> delegate_ = nil; + // The current download task. std::unique_ptr<web::DownloadTask> download_task_;
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm index de9a1d9..399768a 100644 --- a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm +++ b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
@@ -115,24 +115,28 @@ void ARQuickLookTabHelper::Download( std::unique_ptr<web::DownloadTask> download_task) { DCHECK(download_task); - LogHistogram(download_task.get()); + if (download_task_) { + RemoveCurrentDownload(); + } base::FilePath download_dir; if (!GetTempDownloadsDirectory(&download_dir)) { return; } - if (download_task_) { - RemoveCurrentDownload(); - } // Take ownership of |download_task| and start the download. download_task_ = std::move(download_task); + LogHistogram(download_task_.get()); download_task_->AddObserver(this); - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, - base::BindOnce(&base::CreateDirectory, download_dir), - base::BindOnce(&ARQuickLookTabHelper::DownloadWithDestinationDir, - AsWeakPtr(), download_dir, download_task_.get())); + + download_task_->Start( + download_dir.Append(download_task_->GenerateFileName())); + + // Calling DownloadTask::Start() may cause the task to be immediately + // destroyed (e.g. if it is in error). Only call `LogHistogram` is it + // is still valid and owned by the current object. + if (download_task_) + LogHistogram(download_task_.get()); } void ARQuickLookTabHelper::DidFinishDownload() { @@ -173,26 +177,6 @@ download_task_.reset(); } -void ARQuickLookTabHelper::DownloadWithDestinationDir( - const base::FilePath& destination_dir, - web::DownloadTask* download_task, - bool directory_created) { - // Return early if |download_task_| has changed. - if (download_task != download_task_.get()) { - return; - } - - if (!directory_created) { - RemoveCurrentDownload(); - return; - } - - base::FilePath filename = download_task_->GenerateFileName(); - base::FilePath path = destination_dir.Append(filename); - download_task->Start(path, web::DownloadTask::Destination::kToDisk); - LogHistogram(download_task_.get()); -} - void ARQuickLookTabHelper::OnDownloadUpdated(web::DownloadTask* download_task) { DCHECK_EQ(download_task, download_task_.get());
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm index 0c8a3d57..000388cf 100644 --- a/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm +++ b/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm
@@ -286,8 +286,8 @@ EXPECT_TRUE(delegate().allowsContentScaling); } -// Tests replacing the download task brefore it's started. -TEST_P(ARQuickLookTabHelperTest, ReplaceUnstartedDownload) { +// Tests replacing the download task before it make any progress. +TEST_P(ARQuickLookTabHelperTest, ReplaceStartedNoProgressDownload) { auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), GetParam()); task->SetGeneratedFileName(base::FilePath(kTestSuggestedFileName)); tab_helper()->Download(std::move(task)); @@ -315,7 +315,7 @@ kHistogramName, static_cast<base::HistogramBase::Sample>( IOSDownloadARModelState::kStarted), - 1); + 2); histogram_tester()->ExpectBucketCount( kHistogramName, static_cast<base::HistogramBase::Sample>(
diff --git a/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm b/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm index f3cbdac8..097e9ea 100644 --- a/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm +++ b/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm
@@ -149,7 +149,7 @@ web::FakeDownloadTask* task_ptr = task.get(); ASSERT_FALSE(tab_helper()->has_download_task()); tab_helper()->Download(std::move(task)); - task_ptr->Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task_ptr->Start(base::FilePath()); ASSERT_TRUE(tab_helper()->has_download_task()); task_ptr->Cancel();
diff --git a/ios/chrome/browser/download/pass_kit_tab_helper.h b/ios/chrome/browser/download/pass_kit_tab_helper.h index cd6deb8..52c0eaa 100644 --- a/ios/chrome/browser/download/pass_kit_tab_helper.h +++ b/ios/chrome/browser/download/pass_kit_tab_helper.h
@@ -5,12 +5,15 @@ #ifndef IOS_CHROME_BROWSER_DOWNLOAD_PASS_KIT_TAB_HELPER_H_ #define IOS_CHROME_BROWSER_DOWNLOAD_PASS_KIT_TAB_HELPER_H_ +#import <Foundation/Foundation.h> + #include <memory> #include <set> #include "base/containers/unique_ptr_adapters.h" +#include "base/memory/weak_ptr.h" #include "ios/web/public/download/download_task_observer.h" -#import "ios/web/public/web_state_user_data.h" +#include "ios/web/public/web_state_user_data.h" @protocol PassKitTabHelperDelegate; namespace web { @@ -65,12 +68,18 @@ // web::DownloadTaskObserver overrides: void OnDownloadUpdated(web::DownloadTask* task) override; + // Called when the downloaded data is available. + void OnDownloadDataRead(std::unique_ptr<web::DownloadTask> task, + NSData* data); + web::WebState* web_state_; __weak id<PassKitTabHelperDelegate> delegate_ = nil; // Set of unfinished download tasks. std::set<std::unique_ptr<web::DownloadTask>, base::UniquePtrComparator> tasks_; + base::WeakPtrFactory<PassKitTabHelper> weak_factory_{this}; + WEB_STATE_USER_DATA_KEY_DECL(); };
diff --git a/ios/chrome/browser/download/pass_kit_tab_helper.mm b/ios/chrome/browser/download/pass_kit_tab_helper.mm index 848f251e..c4a6058 100644 --- a/ios/chrome/browser/download/pass_kit_tab_helper.mm +++ b/ios/chrome/browser/download/pass_kit_tab_helper.mm
@@ -58,7 +58,7 @@ // unfinished tasks. tasks_.insert(std::move(task)); task_ptr->AddObserver(this); - task_ptr->Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task_ptr->Start(base::FilePath()); } void PassKitTabHelper::SetDelegate(id<PassKitTabHelperDelegate> delegate) { @@ -66,24 +66,35 @@ } void PassKitTabHelper::OnDownloadUpdated(web::DownloadTask* updated_task) { - auto it = tasks_.find(updated_task); - DCHECK(it != tasks_.end()); - + auto iterator = tasks_.find(updated_task); + DCHECK(iterator != tasks_.end()); if (!updated_task->IsDone()) return; - NSData* nsdata = updated_task->GetResponseData(); - PKPass* pass = [[PKPass alloc] initWithData:nsdata error:nil]; + // Extract the std::unique_ptr<> from the std::set<>. + auto node = tasks_.extract(iterator); + auto task = std::move(node.value()); + DCHECK_EQ(task.get(), updated_task); + + // Stop observing the task as its ownership is transfered to the callback + // that will destroy when it is invoked or cancelled. + updated_task->RemoveObserver(this); + updated_task->GetResponseData( + base::BindOnce(&PassKitTabHelper::OnDownloadDataRead, + weak_factory_.GetWeakPtr(), std::move(task))); +} + +void PassKitTabHelper::OnDownloadDataRead( + std::unique_ptr<web::DownloadTask> task, + NSData* data) { + DCHECK(task); + PKPass* pass = [[PKPass alloc] initWithData:data error:nil]; [delegate_ passKitTabHelper:this presentDialogForPass:pass webState:web_state_]; - UMA_HISTOGRAM_ENUMERATION(kUmaDownloadPassKitResult, - GetUmaResult(updated_task), + UMA_HISTOGRAM_ENUMERATION(kUmaDownloadPassKitResult, GetUmaResult(task.get()), DownloadPassKitResult::Count); - - updated_task->RemoveObserver(this); - tasks_.erase(it); } WEB_STATE_USER_DATA_KEY_IMPL(PassKitTabHelper)
diff --git a/ios/chrome/browser/download/pass_kit_tab_helper_unittest.mm b/ios/chrome/browser/download/pass_kit_tab_helper_unittest.mm index b703e47e..40f7f59 100644 --- a/ios/chrome/browser/download/pass_kit_tab_helper_unittest.mm +++ b/ios/chrome/browser/download/pass_kit_tab_helper_unittest.mm
@@ -4,23 +4,24 @@ #import "ios/chrome/browser/download/pass_kit_tab_helper.h" -#include <memory> +#import <memory> #import <PassKit/PassKit.h> -#include "base/callback_helpers.h" -#include "base/test/metrics/histogram_tester.h" -#include "ios/chrome/browser/download/download_test_util.h" -#include "ios/chrome/browser/download/mime_type_util.h" +#import "base/callback_helpers.h" +#import "base/test/metrics/histogram_tester.h" +#import "base/test/task_environment.h" +#import "ios/chrome/browser/download/download_test_util.h" +#import "ios/chrome/browser/download/mime_type_util.h" #import "ios/chrome/test/fakes/fake_pass_kit_tab_helper_delegate.h" #import "ios/web/public/test/fakes/fake_download_task.h" #import "ios/web/public/test/fakes/fake_web_state.h" -#include "net/base/io_buffer.h" -#include "net/base/net_errors.h" -#include "net/url_request/url_fetcher_response_writer.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/gtest_mac.h" -#include "testing/platform_test.h" +#import "net/base/io_buffer.h" +#import "net/base/net_errors.h" +#import "net/url_request/url_fetcher_response_writer.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/gtest_mac.h" +#import "testing/platform_test.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -46,6 +47,7 @@ return PassKitTabHelper::FromWebState(&web_state_); } + base::test::TaskEnvironment task_environment_; web::FakeWebState web_state_; FakePassKitTabHelperDelegate* delegate_; base::HistogramTester histogram_tester_;
diff --git a/ios/chrome/browser/download/vcard_tab_helper.h b/ios/chrome/browser/download/vcard_tab_helper.h index 1cd41da5..3a03a8d 100644 --- a/ios/chrome/browser/download/vcard_tab_helper.h +++ b/ios/chrome/browser/download/vcard_tab_helper.h
@@ -6,11 +6,13 @@ #define IOS_CHROME_BROWSER_DOWNLOAD_VCARD_TAB_HELPER_H_ #import <Foundation/Foundation.h> + #include <set> #include "base/containers/unique_ptr_adapters.h" +#include "base/memory/weak_ptr.h" #include "ios/web/public/download/download_task_observer.h" -#import "ios/web/public/web_state_user_data.h" +#include "ios/web/public/web_state_user_data.h" @protocol VcardTabHelperDelegate; namespace web { @@ -46,12 +48,18 @@ // web::DownloadTaskObserver overrides: void OnDownloadUpdated(web::DownloadTask* task) override; + // Called when the downloaded data is available. + void OnDownloadDataRead(std::unique_ptr<web::DownloadTask> task, + NSData* data); + __weak id<VcardTabHelperDelegate> delegate_ = nil; // Set of unfinished download tasks. std::set<std::unique_ptr<web::DownloadTask>, base::UniquePtrComparator> tasks_; + base::WeakPtrFactory<VcardTabHelper> weak_factory_{this}; + WEB_STATE_USER_DATA_KEY_DECL(); };
diff --git a/ios/chrome/browser/download/vcard_tab_helper.mm b/ios/chrome/browser/download/vcard_tab_helper.mm index a9494bf2..6c2e949 100644 --- a/ios/chrome/browser/download/vcard_tab_helper.mm +++ b/ios/chrome/browser/download/vcard_tab_helper.mm
@@ -34,23 +34,32 @@ // and OnDownloadUpdated called immediately. tasks_.insert(std::move(task)); task_ptr->AddObserver(this); - task_ptr->Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task_ptr->Start(base::FilePath()); } void VcardTabHelper::OnDownloadUpdated(web::DownloadTask* updated_task) { - auto it = tasks_.find(updated_task); - DCHECK(it != tasks_.end()); - + auto iterator = tasks_.find(updated_task); + DCHECK(iterator != tasks_.end()); if (!updated_task->IsDone()) return; - NSData* vcardData = updated_task->GetResponseData(); - if (vcardData) { - [delegate_ openVcardFromData:vcardData]; - } + // Extract the std::unique_ptr<> from the std::set<>. + auto node = tasks_.extract(iterator); + auto task = std::move(node.value()); + DCHECK_EQ(task.get(), updated_task); + // Stop observing the task as its ownership is transfered to the callback + // that will destroy when it is invoked or cancelled. updated_task->RemoveObserver(this); - tasks_.erase(it); + updated_task->GetResponseData( + base::BindOnce(&VcardTabHelper::OnDownloadDataRead, + weak_factory_.GetWeakPtr(), std::move(task))); +} + +void VcardTabHelper::OnDownloadDataRead(std::unique_ptr<web::DownloadTask> task, + NSData* data) { + DCHECK(task); + [delegate_ openVcardFromData:data]; } WEB_STATE_USER_DATA_KEY_IMPL(VcardTabHelper)
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm index 59a2b622..6db95b5 100644 --- a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
@@ -185,8 +185,7 @@ // Start the download. base::FilePath path; ASSERT_TRUE(base::GetTempDir(&path)); - task->Start(path.Append(task->GenerateFileName()), - web::DownloadTask::Destination::kToDisk); + task->Start(path.Append(task->GenerateFileName())); @autoreleasepool { // Calling -downloadManagerViewControllerDidStartDownload will retain and @@ -249,7 +248,7 @@ // one. TEST_F(DownloadManagerCoordinatorTest, DelegateReplacedDownload) { auto task = CreateTestTask(); - task->Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task->Start(base::FilePath()); task->SetDone(true); [coordinator_ downloadManagerTabHelper:tab_helper() @@ -450,8 +449,7 @@ // Start the download. base::FilePath path; ASSERT_TRUE(base::GetTempDir(&path)); - task->Start(path.Append(task->GenerateFileName()), - web::DownloadTask::Destination::kToDisk); + task->Start(path.Append(task->GenerateFileName())); // Stub UIActivityViewController. OCMStub([download_view_controller_mock presentViewController:[OCMArg any] @@ -603,7 +601,7 @@ // should present the confirmation dialog. TEST_F(DownloadManagerCoordinatorTest, CloseInProgressDownload) { auto task = CreateTestTask(); - task->Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task->Start(base::FilePath()); coordinator_.downloadTask = task.get(); [coordinator_ start]; @@ -885,8 +883,7 @@ // Start the download. base::FilePath path; ASSERT_TRUE(base::GetTempDir(&path)); - task->Start(path.Append(task->GenerateFileName()), - web::DownloadTask::Destination::kToDisk); + task->Start(path.Append(task->GenerateFileName())); // Start the download. @autoreleasepool {
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.h b/ios/chrome/browser/ui/download/download_manager_mediator.h index 5b1bbff..805815b 100644 --- a/ios/chrome/browser/ui/download/download_manager_mediator.h +++ b/ios/chrome/browser/ui/download/download_manager_mediator.h
@@ -41,11 +41,6 @@ void StartDowloading(); private: - // Asynchronously starts download operation in the given directory. - void DownloadWithDestinationDir(const base::FilePath& destination_dir, - web::DownloadTask* task, - bool directory_created); - // Updates consumer from web::DownloadTask. void UpdateConsumer();
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.mm b/ios/chrome/browser/ui/download/download_manager_mediator.mm index 0fb13e0a..a50f8dc1 100644 --- a/ios/chrome/browser/ui/download/download_manager_mediator.mm +++ b/ios/chrome/browser/ui/download/download_manager_mediator.mm
@@ -62,30 +62,7 @@ // "Start Download" button. [consumer_ setState:kDownloadManagerStateInProgress]; - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, - base::BindOnce(&base::CreateDirectory, download_dir), - base::BindOnce(&DownloadManagerMediator::DownloadWithDestinationDir, - weak_ptr_factory_.GetWeakPtr(), download_dir, task_)); -} - -void DownloadManagerMediator::DownloadWithDestinationDir( - const base::FilePath& destination_dir, - web::DownloadTask* task, - bool directory_created) { - if (!directory_created) { - [consumer_ setState:kDownloadManagerStateFailed]; - return; - } - - if (task_ != task) { - // Download task has been replaced, so simply ignore the old download. - return; - } - - base::FilePath filename = task_->GenerateFileName(); - base::FilePath path = destination_dir.Append(filename); - task->Start(path, web::DownloadTask::Destination::kToDisk); + task_->Start(download_dir.Append(task_->GenerateFileName())); } void DownloadManagerMediator::OnDownloadUpdated(web::DownloadTask* task) {
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm b/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm index c88ea01..0b23dd0f 100644 --- a/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm +++ b/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm
@@ -229,7 +229,7 @@ mediator_.SetDownloadTask(task()); mediator_.SetConsumer(consumer_); - task()->Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task()->Start(base::FilePath()); EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state); EXPECT_FALSE(consumer_.installDriveButtonVisible); EXPECT_EQ(0.0, consumer_.progress);
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.mm index 8bc1b18..9f2d7e8b 100644 --- a/ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.mm +++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.mm
@@ -51,7 +51,7 @@ return @{ NSForegroundColorAttributeName : [UIColor colorNamed:kTextSecondaryColor], NSFontAttributeName : - [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote], + [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2], NSParagraphStyleAttributeName : paragraph_style }; }
diff --git a/ios/chrome/browser/ui/first_run/sync/sync_screen_view_controller.mm b/ios/chrome/browser/ui/first_run/sync/sync_screen_view_controller.mm index 41be542..b4f658b 100644 --- a/ios/chrome/browser/ui/first_run/sync/sync_screen_view_controller.mm +++ b/ios/chrome/browser/ui/first_run/sync/sync_screen_view_controller.mm
@@ -154,7 +154,7 @@ NSDictionary* textAttributes = @{ NSForegroundColorAttributeName : [UIColor colorNamed:kTextSecondaryColor], NSFontAttributeName : - [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote], + [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2], NSParagraphStyleAttributeName : paragraphStyle };
diff --git a/ios/chrome/browser/ui/first_run/welcome_to_chrome_view.mm b/ios/chrome/browser/ui/first_run/welcome_to_chrome_view.mm index d068a2d3..a084cf8d 100644 --- a/ios/chrome/browser/ui/first_run/welcome_to_chrome_view.mm +++ b/ios/chrome/browser/ui/first_run/welcome_to_chrome_view.mm
@@ -40,7 +40,7 @@ SIZE_CLASS_COUNT = UNSPECIFIED, }; -// Returns the SizeClassIdiom corresponding with |size_class|. +// Returns the SizeClassIdiom corresponding with `size_class`. SizeClassIdiom GetSizeClassIdiom(UIUserInterfaceSizeClass size_class) { switch (size_class) { case UIUserInterfaceSizeClassCompact: @@ -52,7 +52,7 @@ } } -// Sets the line height for |label| via attributed text. +// Sets the line height for `label` via attributed text. void SetLabelLineHeight(UILabel* label, CGFloat line_height) { NSMutableAttributedString* updated_text = [label.attributedText mutableCopy]; if (updated_text.length == 0) @@ -421,7 +421,7 @@ } - (void)layoutImageView { - // The image is centered and laid out below |titleLabel| as specified by + // The image is centered and laid out below `titleLabel` as specified by // kImageTopPadding. CGSize imageViewSize = self.imageView.bounds.size; CGFloat imageViewTopPadding = kImageTopPadding[[self heightSizeClassIdiom]]; @@ -432,7 +432,7 @@ } - (void)layoutTOSTextView { - // The TOSTextView is centered and laid out below |imageView| as specified by + // The TOSTextView is centered and laid out below `imageView` as specified by // kTOSTextViewTopPadding. CGSize containerSize = self.containerView.bounds.size; containerSize.height = CGFLOAT_MAX; @@ -448,7 +448,7 @@ - (void)layoutOptInLabel { // The opt in label is laid out to the right (or left in RTL) of the check box - // button and below |TOSLabel| as specified by kOptInLabelPadding. + // button and below `TOSLabel` as specified by kOptInLabelPadding. CGSize checkBoxSize = [self.checkBoxButton imageForState:self.checkBoxButton.state].size; CGFloat checkBoxPadding = kCheckBoxPadding[[self widthSizeClassIdiom]]; @@ -468,10 +468,10 @@ } - (void)layoutCheckBoxButton { - // The checkBoxButton is laid out to the left of |optInLabel|. The view + // The checkBoxButton is laid out to the left of `optInLabel`. The view // itself is sized so that it covers the label, and the image insets are // chosen such that the check box image is centered vertically with - // |optInLabel|. + // `optInLabel`. CGSize checkBoxSize = [self.checkBoxButton imageForState:self.checkBoxButton.state].size; CGFloat checkBoxPadding = kCheckBoxPadding[[self widthSizeClassIdiom]]; @@ -496,8 +496,8 @@ - (void)layoutManagedLabel { // The managed label is laid out to the right (or left in RTL) of the - // enterprise icon and below |optInLabel| as specified by - // kManagedLabelPadding. It is aligned horizontally with |optInLabel|. + // enterprise icon and below `optInLabel` as specified by + // kManagedLabelPadding. It is aligned horizontally with `optInLabel`. CGSize checkBoxSize = [self.checkBoxButton imageForState:self.checkBoxButton.state].size; CGFloat checkBoxPadding = kCheckBoxPadding[[self widthSizeClassIdiom]]; @@ -520,8 +520,8 @@ - (void)layoutEnterpriseIcon { // The enterprise icon is laid out to the left of and is centered vertically - // with |managedLabel|, and is aligned horizontally with the checkbox image - // inside |checkBoxButton|. + // with `managedLabel`, and is aligned horizontally with the checkbox image + // inside `checkBoxButton`. CGSize enterpriseIconSize = self.enterpriseIcon.bounds.size; CGFloat enterpriseIconOriginX = CGRectGetMidX(self.checkBoxButton.imageView.frame) - @@ -536,11 +536,11 @@ - (void)layoutContainerView { // The container view is resized according to the final layout of its lowest - // subview, which is |managedLabel| if the browser is managed and - // |checkBoxButton| if not. The resized view is then centered horizontally and + // subview, which is `managedLabel` if the browser is managed and + // `checkBoxButton` if not. The resized view is then centered horizontally and // vertically. If necessary, it is shifted up to allow either - // |kmanagedLabelPadding| or |kOptInLabelPadding| (depending if the browser is - // managed) between |optInLabel| and |OKButton|. + // `kmanagedLabelPadding` or `kOptInLabelPadding` (depending if the browser is + // managed) between `optInLabel` and `OKButton`. CGSize containerViewSize = self.containerView.bounds.size; containerViewSize.height = [self isBrowserManaged] ? CGRectGetMaxY(self.managedLabel.frame)
diff --git a/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift b/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift index b2506488..bef7a37d 100644 --- a/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift +++ b/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift
@@ -67,7 +67,7 @@ /// Enable this to tell the row it should display its own custom separator at the bottom. let shouldDisplayCustomSeparator: Bool var customSeparatorColor: Color { - uiVariation == .one ? .separator : .grey700 + uiVariation == .one ? .separator : .grey200 } @ViewBuilder var customSeparator: some View {
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm index 3109553f..f565ef7 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm
@@ -8,6 +8,7 @@ #include "components/password_manager/core/common/password_manager_pref_names.h" #import "components/policy/core/common/policy_loader_ios_constants.h" #import "components/policy/policy_constants.h" +#include "components/safe_browsing/core/common/features.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/signin/public/base/signin_pref_names.h" #include "components/signin/public/base/signin_switches.h" @@ -112,6 +113,14 @@ password_manager::features::kLeakDetectionUnauthenticated); } + if ([self isRunningTest:@selector(testToggleSafeBrowsing)] || + [self isRunningTest:@selector + (testTogglePasswordLeakCheckForSignedInUser)] || + [self isRunningTest:@selector + (testTogglePasswordLeakCheckForSignedOutUser)]) { + config.features_disabled.push_back(safe_browsing::kEnhancedProtection); + } + return config; }
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.h b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.h index d7b1017..724f47b2 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.h +++ b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.h
@@ -7,7 +7,6 @@ #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" -@protocol ApplicationCommands; @class PrivacySafeBrowsingCoordinator; // Delegate for PrivacySafeBrowsingCoordinator.
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.mm b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.mm index 24943cf..7671b61 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.mm +++ b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.mm
@@ -12,11 +12,6 @@ #import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" -#import "ios/chrome/browser/ui/commands/application_commands.h" -#import "ios/chrome/browser/ui/commands/browsing_data_commands.h" -#import "ios/chrome/browser/ui/commands/command_dispatcher.h" -#import "ios/chrome/browser/ui/commands/open_new_tab_command.h" -#import "ios/chrome/browser/ui/commands/show_signin_command.h" #import "ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.h" #import "ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_navigation_commands.h" #import "ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_view_controller.h" @@ -84,9 +79,6 @@ self.mediator.consumer = self.viewController; self.mediator.handler = self; self.viewController.modelDelegate = self.mediator; - self.viewController.dispatcher = static_cast< - id<ApplicationCommands, BrowserCommands, BrowsingDataCommands>>( - self.browser->GetCommandDispatcher()); DCHECK(self.baseNavigationController); [self.baseNavigationController pushViewController:self.viewController animated:YES];
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm index 289b52e..44f86e77 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
@@ -432,10 +432,13 @@ return; } - if (preferenceName == prefs::kSafeBrowsingEnabled || - preferenceName == prefs::kSafeBrowsingEnhanced) { - _safeBrowsingDetailItem.detailText = [self safeBrowsingDetailText]; - [self reconfigureCellsForItems:@[ _safeBrowsingDetailItem ]]; + if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) { + DCHECK(_safeBrowsingDetailItem); + if (preferenceName == prefs::kSafeBrowsingEnabled || + preferenceName == prefs::kSafeBrowsingEnhanced) { + _safeBrowsingDetailItem.detailText = [self safeBrowsingDetailText]; + [self reconfigureCellsForItems:@[ _safeBrowsingDetailItem ]]; + } } }
diff --git a/ios/web/download/data_url_download_task.h b/ios/web/download/data_url_download_task.h index 840b5212..ef83934 100644 --- a/ios/web/download/data_url_download_task.h +++ b/ios/web/download/data_url_download_task.h
@@ -8,9 +8,11 @@ #include "ios/web/download/download_task_impl.h" namespace web { +namespace download { namespace internal { struct ParseDataUrlResult; } // namespace internal +} // namespace download // Implementation of DownloadTaskImpl that uses NSURLRequest to perform the // download. @@ -33,19 +35,13 @@ ~DataUrlDownloadTask() final; - // DownloadTask overrides: - NSData* GetResponseData() const final; - const base::FilePath& GetResponsePath() const final; - // DownloadTaskImpl overrides: - void Start(const base::FilePath& path, Destination destination_hint) final; + void StartInternal(const base::FilePath& path) final; + void CancelInternal() final; private: // Called when the data: url has been parsed and optionally written to disk. - void OnDataUrlParsed(internal::ParseDataUrlResult result); - - __strong NSData* data_ = nil; - base::FilePath path_; + void OnDataUrlParsed(download::internal::ParseDataUrlResult result); base::WeakPtrFactory<DataUrlDownloadTask> weak_factory_{this}; };
diff --git a/ios/web/download/data_url_download_task.mm b/ios/web/download/data_url_download_task.mm index 385cf4d..1baaa2d 100644 --- a/ios/web/download/data_url_download_task.mm +++ b/ios/web/download/data_url_download_task.mm
@@ -7,7 +7,6 @@ #import "base/check.h" #import "base/files/file_path.h" #import "base/files/file_util.h" -#import "base/strings/sys_string_conversions.h" #import "base/task/sequenced_task_runner.h" #import "ios/web/download/download_result.h" #import "net/base/data_url.h" @@ -17,6 +16,7 @@ #endif namespace web { +namespace download { namespace internal { // Helper struct that store the error code and data (in case of success) of @@ -24,19 +24,16 @@ struct ParseDataUrlResult { int net_error_code = net::OK; - std::string data; + int64_t data_size = 0; std::string mime_type; - base::FilePath path; explicit ParseDataUrlResult(int net_error_code) : net_error_code(net_error_code) { DCHECK_NE(net_error_code, net::OK); } - ParseDataUrlResult(std::string data, - std::string mime_type, - base::FilePath path) - : data(std::move(data)), mime_type(std::move(mime_type)), path(path) {} + ParseDataUrlResult(int64_t data_size, std::string mime_type) + : data_size(data_size), mime_type(std::move(mime_type)) {} ParseDataUrlResult(ParseDataUrlResult&& other) = default; ParseDataUrlResult& operator=(ParseDataUrlResult&& other) = default; @@ -57,17 +54,17 @@ return ParseDataUrlResult(net::ERR_INVALID_URL); } - if (!path.empty() && !base::WriteFile(path, data)) { + if (!base::WriteFile(path, data)) { return ParseDataUrlResult( net::MapSystemError(logging::GetLastSystemErrorCode())); } - return ParseDataUrlResult(std::move(data), std::move(mime_type), - std::move(path)); + return ParseDataUrlResult(data.size(), std::move(mime_type)); } } // anonymous namespace } // namespace internal +} // namespace download DataUrlDownloadTask::DataUrlDownloadTask( WebState* web_state, @@ -91,44 +88,35 @@ DataUrlDownloadTask::~DataUrlDownloadTask() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CancelInternal(); } -NSData* DataUrlDownloadTask::GetResponseData() const { +void DataUrlDownloadTask::StartInternal(const base::FilePath& path) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(IsDone()); - return data_; -} + DCHECK(!path.empty()); -const base::FilePath& DataUrlDownloadTask::GetResponsePath() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(IsDone()); - return path_; -} - -void DataUrlDownloadTask::Start(const base::FilePath& path, - Destination destination_hint) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DownloadTaskImpl::Start(path, destination_hint); - + using download::internal::ParseDataUrlAndSaveToFile; task_runner_->PostTaskAndReplyWithResult( FROM_HERE, - base::BindOnce( - &internal::ParseDataUrlAndSaveToFile, original_url_, - destination_hint != Destination::kToMemory ? path : base::FilePath()), + base::BindOnce(&ParseDataUrlAndSaveToFile, original_url_, path), base::BindOnce(&DataUrlDownloadTask::OnDataUrlParsed, weak_factory_.GetWeakPtr())); } -void DataUrlDownloadTask::OnDataUrlParsed(internal::ParseDataUrlResult result) { +void DataUrlDownloadTask::CancelInternal() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + weak_factory_.InvalidateWeakPtrs(); +} + +void DataUrlDownloadTask::OnDataUrlParsed( + download::internal::ParseDataUrlResult result) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (result.net_error_code == net::OK) { percent_complete_ = 100; - total_bytes_ = result.data.size(); + total_bytes_ = result.data_size; received_bytes_ = total_bytes_; mime_type_ = std::move(result.mime_type); - data_ = [NSData dataWithBytes:result.data.data() length:result.data.size()]; - path_ = std::move(result.path); } OnDownloadFinished(DownloadResult(result.net_error_code));
diff --git a/ios/web/download/data_url_download_task_unittest.mm b/ios/web/download/data_url_download_task_unittest.mm index b41e3f4..db59934 100644 --- a/ios/web/download/data_url_download_task_unittest.mm +++ b/ios/web/download/data_url_download_task_unittest.mm
@@ -67,7 +67,7 @@ // Start the task and wait for completion. { web::test::WaitDownloadTaskDone observer(&task); - task.Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task.Start(base::FilePath()); observer.Wait(); } @@ -103,7 +103,7 @@ // Start the task and wait for completion. { web::test::WaitDownloadTaskDone observer(&task); - task.Start(path, web::DownloadTask::Destination::kToDisk); + task.Start(path); observer.Wait(); } @@ -137,14 +137,13 @@ // Start the task and wait for completion. { web::test::WaitDownloadTaskDone observer(&task); - task.Start(base::FilePath(FILE_PATH_LITERAL("/no-such-dir/file.txt")), - web::DownloadTask::Destination::kToDisk); + task.Start(base::FilePath(FILE_PATH_LITERAL("/no-such-dir/file.txt"))); observer.Wait(); } // Verify the state of downloaded task. EXPECT_EQ(DownloadTask::State::kFailed, task.GetState()); - EXPECT_EQ(net::ERR_FILE_NOT_FOUND, task.GetErrorCode()); + EXPECT_EQ(net::ERR_ACCESS_DENIED, task.GetErrorCode()); EXPECT_EQ(-1, task.GetTotalBytes()); EXPECT_EQ(0, task.GetReceivedBytes()); EXPECT_EQ(0, task.GetPercentComplete()); @@ -166,7 +165,7 @@ // Start the task and wait for completion. { web::test::WaitDownloadTaskDone observer(&task); - task.Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task.Start(base::FilePath()); observer.Wait(); }
diff --git a/ios/web/download/download_controller_impl_unittest.mm b/ios/web/download/download_controller_impl_unittest.mm index 4dd276f6..d6069b8 100644 --- a/ios/web/download/download_controller_impl_unittest.mm +++ b/ios/web/download/download_controller_impl_unittest.mm
@@ -114,8 +114,8 @@ EXPECT_NSEQ(@"POST", task->GetHttpMethod()); EXPECT_FALSE(task->IsDone()); EXPECT_EQ(0, task->GetErrorCode()); - EXPECT_EQ(0, task->GetTotalBytes()); - EXPECT_EQ(0, task->GetPercentComplete()); + EXPECT_EQ(-1, task->GetTotalBytes()); + EXPECT_EQ(-1, task->GetPercentComplete()); EXPECT_EQ(kContentDisposition, task->GetContentDisposition()); EXPECT_EQ(kMimeType, task->GetMimeType()); EXPECT_EQ(base::FilePath(kTestFileName), task->GenerateFileName());
diff --git a/ios/web/download/download_inttest.mm b/ios/web/download/download_inttest.mm index 7b5fb5b..bdbb72b 100644 --- a/ios/web/download/download_inttest.mm +++ b/ios/web/download/download_inttest.mm
@@ -108,7 +108,7 @@ // Start the download task and wait for completion. { web::test::WaitDownloadTaskDone observer(task); - task->Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task->Start(base::FilePath()); observer.Wait(); }
diff --git a/ios/web/download/download_native_task_bridge.h b/ios/web/download/download_native_task_bridge.h index bad7404..a3becb4 100644 --- a/ios/web/download/download_native_task_bridge.h +++ b/ios/web/download/download_native_task_bridge.h
@@ -7,8 +7,23 @@ #import <WebKit/WebKit.h> +#include "base/callback_forward.h" #include "ios/web/download/download_result.h" +namespace base { +class FilePath; +} + +// Callback invoked repeatedly when new data is received from the WKDownload*. +using NativeDownloadTaskProgressCallback = + base::RepeatingCallback<void(int64_t bytes_received, + int64_t total_bytes, + double fraction_completed)>; + +// Callback invoked once the WKDownload completes, possibly in error. +using NativeDownloadTaskCompleteCallback = + base::OnceCallback<void(web::DownloadResult result)>; + @class DownloadNativeTaskBridge; @protocol DownloadNativeTaskBridgeDelegate <NSObject> @@ -40,10 +55,11 @@ // Cancels download - (void)cancel; -// Starts download and sets |progressionHandler| and |completionHandler| -- (void)startDownload:(NSURL*)url - progressionHandler:(void (^)())progressionHander - completionHandler:(web::DownloadCompletionHandler)completionHandler; +// Starts download to `path` with given `progressCallback` and +// `completeCallback`. +- (void)startDownload:(const base::FilePath&)path + progressCallback:(NativeDownloadTaskProgressCallback)progressCallback + completeCallback:(NativeDownloadTaskCompleteCallback)completeCallback; @property(nonatomic, readonly) WKDownload* download API_AVAILABLE(ios(15)); @property(nonatomic, readonly) NSURLResponse* response;
diff --git a/ios/web/download/download_native_task_bridge.mm b/ios/web/download/download_native_task_bridge.mm index fd8fdc8..fc2178d 100644 --- a/ios/web/download/download_native_task_bridge.mm +++ b/ios/web/download/download_native_task_bridge.mm
@@ -4,9 +4,11 @@ #import "ios/web/download/download_native_task_bridge.h" +#import "base/callback.h" #import "base/check.h" -#include "ios/web/download/download_result.h" -#include "net/base/net_errors.h" +#import "base/strings/sys_string_conversions.h" +#import "ios/web/download/download_result.h" +#import "net/base/net_errors.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -23,8 +25,8 @@ @implementation DownloadNativeTaskBridge { void (^_startDownloadBlock)(NSURL*); id<DownloadNativeTaskBridgeDelegate> _delegate; - void (^_progressionHandler)(); - web::DownloadCompletionHandler _completionHandler; + NativeDownloadTaskProgressCallback _progressCallback; + NativeDownloadTaskCompleteCallback _completeCallback; BOOL _observingDownloadProgress; } @@ -79,24 +81,15 @@ _download = nil; } -- (void)startDownload:(NSURL*)url - progressionHandler:(void (^)())progressionHandler - completionHandler:(web::DownloadCompletionHandler)completionHandler { - // Logic for when the same file is redownloaded as it will use the same file - // path. - if ([[NSFileManager defaultManager] fileExistsAtPath:[url path]]) { - NSError* error = nil; - if (![[NSFileManager defaultManager] removeItemAtPath:[url path] - error:&error]) { - [self download:_download didFailWithError:error resumeData:nil]; - return; - } - } +- (void)startDownload:(const base::FilePath&)path + progressCallback:(NativeDownloadTaskProgressCallback)progressCallback + completeCallback:(NativeDownloadTaskCompleteCallback)completeCallback { + DCHECK(!path.empty()); - _progressionHandler = progressionHandler; - _completionHandler = completionHandler; - - _urlForDownload = [url copy]; + _progressCallback = std::move(progressCallback); + _completeCallback = std::move(completeCallback); + _urlForDownload = + [NSURL fileURLWithPath:base::SysUTF8ToNSString(path.AsUTF8Unsafe())]; if (_resumeData) { DCHECK(!_startDownloadBlock); @@ -124,8 +117,10 @@ //-decideDestinationUsingResponse:suggestedFilename:completionHandler: // where the download will be started. } else { + _progressCallback.Reset(); + web::DownloadResult download_result(net::ERR_FAILED, /*can_retry=*/false); - (_completionHandler)(download_result); + std::move(_completeCallback).Run(download_result); } } @@ -140,17 +135,17 @@ - (void)download:(WKDownload*)download decideDestinationUsingResponse:(NSURLResponse*)response suggestedFilename:(NSString*)suggestedFilename - completionHandler: - (void (^)(NSURL* destination))completionHandler API_AVAILABLE(ios(15)) { + completionHandler:(void (^)(NSURL* destination))handler + API_AVAILABLE(ios(15)) { _response = response; _suggestedFilename = suggestedFilename; if (_urlForDownload) { // Resuming a download. [self startObservingDownloadProgress]; - completionHandler(_urlForDownload); + handler(_urlForDownload); } else { - _startDownloadBlock = completionHandler; + _startDownloadBlock = handler; [_delegate onDownloadNativeTaskBridgeReadyForDownload:self]; } } @@ -160,17 +155,21 @@ resumeData:(NSData*)resumeData API_AVAILABLE(ios(15)) { self.resumeData = resumeData; [self stopObservingDownloadProgress]; - if (_completionHandler) { + if (!_completeCallback.is_null()) { + _progressCallback.Reset(); + web::DownloadResult download_result(net::ERR_FAILED, resumeData != nil); - (_completionHandler)(download_result); + std::move(_completeCallback).Run(download_result); } } - (void)downloadDidFinish:(WKDownload*)download API_AVAILABLE(ios(15)) { [self stopObservingDownloadProgress]; - if (_completionHandler) { + if (!_completeCallback.is_null()) { + _progressCallback.Reset(); + web::DownloadResult download_result(net::OK); - (_completionHandler)(download_result); + std::move(_completeCallback).Run(download_result); } } @@ -180,8 +179,11 @@ ofObject:(id)object change:(NSDictionary*)change context:(void*)context API_AVAILABLE(ios(15)) { - if (_progressionHandler) - _progressionHandler(); + if (!_progressCallback.is_null()) { + NSProgress* progress = self.progress; + _progressCallback.Run(progress.completedUnitCount, progress.totalUnitCount, + progress.fractionCompleted); + } } #pragma mark - Private methods @@ -190,18 +192,18 @@ DCHECK(!_observingDownloadProgress); _observingDownloadProgress = YES; - [_download.progress addObserver:self - forKeyPath:@"fractionCompleted" - options:NSKeyValueObservingOptionNew - context:nil]; + [self.progress addObserver:self + forKeyPath:@"fractionCompleted" + options:NSKeyValueObservingOptionNew + context:nil]; } - (void)stopObservingDownloadProgress { if (_observingDownloadProgress) { _observingDownloadProgress = NO; - [_download.progress removeObserver:self - forKeyPath:@"fractionCompleted" - context:nil]; + [self.progress removeObserver:self + forKeyPath:@"fractionCompleted" + context:nil]; } }
diff --git a/ios/web/download/download_native_task_impl.h b/ios/web/download/download_native_task_impl.h index b4e4ce4..30a6fa6 100644 --- a/ios/web/download/download_native_task_impl.h +++ b/ios/web/download/download_native_task_impl.h
@@ -7,7 +7,6 @@ #import <WebKit/WebKit.h> -#include "base/sequence_checker.h" #include "ios/web/download/download_task_impl.h" @class DownloadNativeTaskBridge; @@ -37,20 +36,17 @@ ~DownloadNativeTaskImpl() final; // DownloadTaskImpl overrides: - void Start(const base::FilePath& path, Destination destination_hint) final; - void Cancel() final; + void StartInternal(const base::FilePath& path) final; + void CancelInternal() final; std::string GetSuggestedName() const final; - // DownloadTask overrides: - NSData* GetResponseData() const final; - const base::FilePath& GetResponsePath() const final; - int64_t GetTotalBytes() const final; - int64_t GetReceivedBytes() const final; - int GetPercentComplete() const final; - private: + // Invoked when the WKDownload* tasks make progress. + void OnDownloadProgress(int64_t bytes_received, + int64_t total_bytes, + double fraction_complete); + DownloadNativeTaskBridge* download_bridge_ API_AVAILABLE(ios(15)) = nil; - base::FilePath download_path_; base::WeakPtrFactory<DownloadNativeTaskImpl> weak_factory_{this}; };
diff --git a/ios/web/download/download_native_task_impl.mm b/ios/web/download/download_native_task_impl.mm index 5ac4c0ee..6de6c16 100644 --- a/ios/web/download/download_native_task_impl.mm +++ b/ios/web/download/download_native_task_impl.mm
@@ -4,10 +4,11 @@ #import "ios/web/download/download_native_task_impl.h" +#import "base/bind.h" +#import "base/callback.h" #import "base/strings/sys_string_conversions.h" #import "base/task/sequenced_task_runner.h" #import "ios/web/download/download_native_task_bridge.h" -#import "net/base/filename_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -39,57 +40,37 @@ DownloadNativeTaskImpl::~DownloadNativeTaskImpl() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (@available(iOS 15, *)) { - [download_bridge_ cancel]; - download_bridge_ = nil; - } + CancelInternal(); } -void DownloadNativeTaskImpl::Start(const base::FilePath& path, - Destination destination_hint) { +void DownloadNativeTaskImpl::StartInternal(const base::FilePath& path) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DownloadTaskImpl::Start(path, destination_hint); - download_path_ = path; - // WKDownload can only download to a file. If the user has - // not specified a destination path, save the file to the - // suggested file name in a temporary directory. - if (download_path_.empty()) { - NSString* temporary_directory = NSTemporaryDirectory(); - NSString* temporary_filename = [temporary_directory - stringByAppendingPathComponent:base::SysUTF8ToNSString( - GenerateFileName().AsUTF8Unsafe())]; - download_path_ = - base::FilePath(base::SysNSStringToUTF8(temporary_filename)); - } + DCHECK(!path.empty()); if (@available(iOS 15, *)) { DCHECK(download_bridge_); - NSURL* downloadURL = [NSURL - fileURLWithPath:base::SysUTF8ToNSString(download_path_.AsUTF8Unsafe())]; - base::WeakPtr<DownloadNativeTaskImpl> weak_this = - weak_factory_.GetWeakPtr(); - [download_bridge_ startDownload:downloadURL - progressionHandler:^() { - DownloadNativeTaskImpl* task = weak_this.get(); - if (task) - task->OnDownloadUpdated(); - } - completionHandler:^(DownloadResult download_result) { - DownloadNativeTaskImpl* task = weak_this.get(); - if (task) - task->OnDownloadFinished(download_result); - }]; + NativeDownloadTaskProgressCallback progress_callback = + base::BindRepeating(&DownloadNativeTaskImpl::OnDownloadProgress, + weak_factory_.GetWeakPtr()); + + NativeDownloadTaskCompleteCallback complete_callback = + base::BindOnce(&DownloadNativeTaskImpl::OnDownloadFinished, + weak_factory_.GetWeakPtr()); + + [download_bridge_ startDownload:path + progressCallback:std::move(progress_callback) + completeCallback:std::move(complete_callback)]; } } -void DownloadNativeTaskImpl::Cancel() { +void DownloadNativeTaskImpl::CancelInternal() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + weak_factory_.InvalidateWeakPtrs(); if (@available(iOS 15, *)) { [download_bridge_ cancel]; download_bridge_ = nil; } - DownloadTaskImpl::Cancel(); } std::string DownloadNativeTaskImpl::GetSuggestedName() const { @@ -100,45 +81,13 @@ return std::string(); } -NSData* DownloadNativeTaskImpl::GetResponseData() const { +void DownloadNativeTaskImpl::OnDownloadProgress(int64_t bytes_received, + int64_t total_bytes, + double fraction_complete) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (@available(iOS 15, *)) { - return [NSData dataWithContentsOfURL:[download_bridge_ urlForDownload]]; - } - return nil; -} - -const base::FilePath& DownloadNativeTaskImpl::GetResponsePath() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (@available(iOS 15, *)) { - return download_path_; - } - static const base::FilePath kEmptyPath; - return kEmptyPath; -} - -int64_t DownloadNativeTaskImpl::GetTotalBytes() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (@available(iOS 15, *)) { - return download_bridge_.progress.totalUnitCount; - } - return total_bytes_; -} - -int64_t DownloadNativeTaskImpl::GetReceivedBytes() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (@available(iOS 15, *)) { - return download_bridge_.progress.completedUnitCount; - } - return received_bytes_; -} - -int DownloadNativeTaskImpl::GetPercentComplete() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (@available(iOS 15, *)) { - return static_cast<int>(download_bridge_.progress.fractionCompleted * 100); - } - return percent_complete_; + total_bytes_ = total_bytes; + received_bytes_ = bytes_received; + percent_complete_ = static_cast<int>(fraction_complete * 100); } } // namespace web
diff --git a/ios/web/download/download_native_task_impl_unittest.mm b/ios/web/download/download_native_task_impl_unittest.mm index 86cebe6..76589ad 100644 --- a/ios/web/download/download_native_task_impl_unittest.mm +++ b/ios/web/download/download_native_task_impl_unittest.mm
@@ -74,8 +74,8 @@ EXPECT_EQ(0, task_->GetErrorCode()); EXPECT_EQ(-1, task_->GetHttpCode()); EXPECT_EQ(0, task_->GetReceivedBytes()); - EXPECT_EQ(0, task_->GetTotalBytes()); - EXPECT_EQ(0, task_->GetPercentComplete()); + EXPECT_EQ(-1, task_->GetTotalBytes()); + EXPECT_EQ(-1, task_->GetPercentComplete()); EXPECT_EQ(kContentDisposition, task_->GetContentDisposition()); EXPECT_EQ(kMimeType, task_->GetMimeType()); EXPECT_EQ(kMimeType, task_->GetOriginalMimeType()); @@ -93,7 +93,7 @@ EXPECT_TRUE(fake_task_bridge_.calledStartDownloadBlock == NO); { web::test::WaitDownloadTaskDone observer(task_.get()); - task_->Start(base::FilePath(), DownloadTask::Destination::kToMemory); + task_->Start(base::FilePath()); observer.Wait(); }
diff --git a/ios/web/download/download_result.h b/ios/web/download/download_result.h index 8b733da0..098fe27 100644 --- a/ios/web/download/download_result.h +++ b/ios/web/download/download_result.h
@@ -35,8 +35,6 @@ bool can_retry_ = true; }; -using DownloadCompletionHandler = void (^)(DownloadResult download_result); - } // namespace web #endif // IOS_WEB_DOWNLOAD_DOWNLOAD_RESULT_H_
diff --git a/ios/web/download/download_session_task_impl.h b/ios/web/download/download_session_task_impl.h index b07fdb4..02d3b3ddf 100644 --- a/ios/web/download/download_session_task_impl.h +++ b/ios/web/download/download_session_task_impl.h
@@ -6,14 +6,16 @@ #define IOS_WEB_DOWNLOAD_DOWNLOAD_SESSION_TASK_IMPL_H_ #include "base/callback.h" -#include "base/ios/block_types.h" +#include "base/files/file.h" #include "ios/web/download/download_task_impl.h" -namespace net { -class URLFetcherResponseWriter; -} - namespace web { +namespace download { +namespace internal { +class Session; +class TaskInfo; +} // namespace internal +} // namespace download // Implementation of DownloadTaskImpl that uses NSURLRequest to perform the // download. @@ -44,55 +46,31 @@ ~DownloadSessionTaskImpl() final; - // DownloadTask overrides: - NSData* GetResponseData() const final; - const base::FilePath& GetResponsePath() const final; - // DownloadTaskImpl overrides: - void Start(const base::FilePath& path, Destination destination_hint) final; - void Cancel() final; + void StartInternal(const base::FilePath& path) final; + void CancelInternal() final; private: - // Called once net::URLFetcherResponseWriter completes the download - void OnWriterDownloadFinished(int error_code); + friend class download::internal::Session; - // Called once the net::URLFetcherResponseWriter created in - // Start() has been initialised. The download can be started - // unless the initialisation has failed (as reported by the - // |writer_initialization_status| result). - void OnWriterInitialized( - std::unique_ptr<net::URLFetcherResponseWriter> writer, - int writer_initialization_status); + // Called when the file has been created. + void OnFileCreated(base::File file); - // Creates background NSURLSession with given |identifier| and |cookies|. - NSURLSession* CreateSession(NSString* identifier, - NSArray<NSHTTPCookie*>* cookies); + // Called when the cookies has been fetched. + void OnCookiesFetched(base::File file, NSArray<NSHTTPCookie*>* cookies); - // Asynchronously returns cookies for WebState associated with this task. - // Must be called on UI thread. The callback will be invoked on the UI thread. - void GetCookies(base::OnceCallback<void(NSArray<NSHTTPCookie*>*)> callback); + // Called when information about the download is received from the + // background NSURLSessionTask. + void ApplyTaskInfo(download::internal::TaskInfo task_info); - // Starts the download with given cookies. - void StartWithCookies(NSArray<NSHTTPCookie*>* cookies); + // Called when data has been written to disk. + void OnDataWritten(int64_t data_size); - // Called to implement the method -URLSession:task:didCompleteWithError: - // from NSURLSessionDataDelegate. - void OnTaskDone(NSURLSessionTask* task, NSError* error); - - // Called to implement the method -URLSession:dataTask:didReceiveData: - // from NSURLSessionDataDelegate. - void OnTaskData(NSURLSessionTask* task, - NSData* data, - ProceduralBlock completion_handler); - - // Called from either OnTaskData() or OnTaskDone() to update the task - // progress, and optionally notify the observer of those updates. - void OnTaskTick(NSURLSessionTask* task, bool notify_download_updated); + // Recompute the completion percentage from received bytes. + void RecomputePercentCompleted(); SessionFactory session_factory_; - std::unique_ptr<net::URLFetcherResponseWriter> writer_; - NSURLSession* session_ = nil; - NSURLSessionTask* session_task_ = nil; + std::unique_ptr<download::internal::Session> session_; base::WeakPtrFactory<DownloadSessionTaskImpl> weak_factory_{this}; };
diff --git a/ios/web/download/download_session_task_impl.mm b/ios/web/download/download_session_task_impl.mm index ec11af6..dd9e457 100644 --- a/ios/web/download/download_session_task_impl.mm +++ b/ios/web/download/download_session_task_impl.mm
@@ -4,33 +4,25 @@ #import "ios/web/download/download_session_task_impl.h" -#import <WebKit/WebKit.h> - #import "base/check.h" #import "base/mac/foundation_util.h" #import "base/sequence_checker.h" #import "base/strings/sys_string_conversions.h" #import "base/task/bind_post_task.h" #import "base/task/sequenced_task_runner.h" -#import "base/task/thread_pool.h" #import "base/threading/sequenced_task_runner_handle.h" #import "ios/net/cookies/system_cookie_util.h" #import "ios/web/common/user_agent.h" #import "ios/web/download/download_result.h" #import "ios/web/download/download_session_cookie_storage.h" #import "ios/web/public/browser_state.h" -#import "ios/web/public/download/download_task_observer.h" #import "ios/web/public/thread/web_task_traits.h" #import "ios/web/public/thread/web_thread.h" #import "ios/web/public/web_client.h" #import "ios/web/public/web_state.h" #import "ios/web/web_view/error_translation_util.h" -#import "net/base/completion_once_callback.h" -#import "net/base/data_url.h" -#import "net/base/io_buffer.h" #import "net/base/mac/url_conversions.h" #import "net/cookies/cookie_store.h" -#import "net/url_request/url_fetcher_response_writer.h" #import "net/url_request/url_request_context.h" #import "net/url_request/url_request_context_getter.h" @@ -38,56 +30,158 @@ #error "This file requires ARC support." #endif +namespace web { +namespace download { +namespace internal { + +// Helper structure used to pass information about the NSURLSessionTask* +// to the DownloadSessionTaskImpl from the background sequence. +class TaskInfo { + public: + TaskInfo(int64_t total_bytes, int http_error_code, NSString* mime_type) + : total_bytes_(total_bytes), + http_error_code_(http_error_code), + mime_type_(mime_type) { + DCHECK(total_bytes_ == -1 || total_bytes >= 0); + DCHECK(http_error_code_ == -1 || http_error_code_ > 0); + DCHECK(!mime_type || mime_type.length != 0); + } + + TaskInfo(TaskInfo&& other) = default; + TaskInfo& operator=(TaskInfo&& other) = default; + + ~TaskInfo() = default; + + // Constructs a TaskInfo from `task`. + static TaskInfo FromTask(NSURLSessionTask* task) { + int http_code = -1; + if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) { + http_code = base::mac::ObjCCastStrict<NSHTTPURLResponse>(task.response) + .statusCode; + } + + return TaskInfo( + task.countOfBytesExpectedToReceive, http_code, + task.response.MIMEType.length != 0 ? task.response.MIMEType : nil); + } + + int64_t total_bytes() const { return total_bytes_; } + int http_error_code() const { return http_error_code_; } + NSString* mime_type() const { return mime_type_; } + + private: + int64_t total_bytes_ = -1; + int http_error_code_ = -1; + NSString* mime_type_ = nil; +}; + +} // namespace internal +} // namespace download +} // namespace web + namespace { -// A callback that will be invoked when -URLSession:task:didCompleteWithError: -// from NSURLSessionDataDelegate is called. In case of success, error will be -// nil. -using DoneCallback = - base::RepeatingCallback<void(NSURLSessionTask* task, NSError* error)>; +// Invoked when data is received from the NSURLSessionTask*. +using DataReceivedHandler = + base::RepeatingCallback<void(NSData* data, + web::download::internal::TaskInfo task_info)>; -// A callback that will be invoked when -URLSession:dataTask:didReceiveData: -// from NSURLSessionDataDelegate is called. The completion handler *must* be -// called at some point. This can be done asynchronously. -using DataCallback = - base::RepeatingCallback<void(NSURLSessionTask* task, - NSData* data, - ProceduralBlock completion_handler)>; +// Invoked when the NSURLSessionTask* terminates. If the task was successful, +// then `error` will be `net::OK` otherwise will reflect the download error. +using TaskFinishedHandler = + base::RepeatingCallback<void(int error_code, + web::download::internal::TaskInfo task_info)>; -// Translates an CFNetwork error code to a net error code. Returns 0 if |error| -// is nil. -int GetNetErrorCodeFromNSError(NSError* error, NSURL* url) { - int error_code = 0; - if (error) { - if (!web::GetNetErrorFromIOSErrorCode(error.code, &error_code, url)) { - error_code = net::ERR_FAILED; +} // anonymous namespace + +// NSURLSessionDataDelegate that forwards data and properties task updates to +// the client. Client of this delegate can pass blocks to receive the updates. +@interface CRWURLSessionDelegate : NSObject <NSURLSessionDataDelegate> + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)initWithDataReceivedHandler:(DataReceivedHandler)dataReceived + taskFinishedHandler:(TaskFinishedHandler)taskFinished + NS_DESIGNATED_INITIALIZER; + +@end + +@implementation CRWURLSessionDelegate { + DataReceivedHandler _dataReceived; + TaskFinishedHandler _taskFinished; +} + +- (instancetype)initWithDataReceivedHandler:(DataReceivedHandler)dataReceived + taskFinishedHandler:(TaskFinishedHandler)taskFinished { + if ((self = [super init])) { + _dataReceived = dataReceived; + _taskFinished = taskFinished; + + DCHECK(!_dataReceived.is_null()); + DCHECK(!_taskFinished.is_null()); + } + return self; +} + +- (void)URLSession:(NSURLSession*)session + task:(NSURLSessionTask*)task + didCompleteWithError:(NSError*)error { + @synchronized(self) { + if (_taskFinished.is_null()) + return; + + int error_code = net::OK; + if (error) { + NSURL* url = task.response.URL; + if (!web::GetNetErrorFromIOSErrorCode(error.code, &error_code, url)) { + error_code = net::ERR_FAILED; + } } + + using web::download::internal::TaskInfo; + _taskFinished.Run(error_code, TaskInfo::FromTask(task)); } - return error_code; } -// Creates a new buffer from raw |data| and |size|. -scoped_refptr<net::IOBufferWithSize> GetBuffer(const void* data, size_t size) { - auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(size); - memcpy(buffer->data(), data, size); - return buffer; +- (void)URLSession:(NSURLSession*)session + dataTask:(NSURLSessionDataTask*)task + didReceiveData:(NSData*)data { + @synchronized(self) { + if (_dataReceived.is_null()) + return; + + using web::download::internal::TaskInfo; + _dataReceived.Run(data, TaskInfo::FromTask(task)); + } } -// Percent complete for the given NSURLSessionTask within [0..100] range. -int GetTaskPercentComplete(NSURLSessionTask* task) { - DCHECK(task); - if (!task.countOfBytesExpectedToReceive) { - return 100; +- (void)URLSession:(NSURLSession*)session + didReceiveChallenge:(NSURLAuthenticationChallenge*)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, + NSURLCredential*))handler { + @synchronized(self) { + // TODO(crbug.com/780911): use CRWCertVerificationController to get + // CertAcceptPolicy for this |challenge|. + handler(NSURLSessionAuthChallengeRejectProtectionSpace, nil); } - if (task.countOfBytesExpectedToReceive == -1) { - return -1; - } - DCHECK_GE(task.countOfBytesExpectedToReceive, task.countOfBytesReceived); - return 100.0 * task.countOfBytesReceived / task.countOfBytesExpectedToReceive; } -// Asynchronously returns cookies for |context_getter|. Must -// be called on IO thread. The callback will be invoked on the UI thread. +- (void)stop { + @synchronized(self) { + _taskFinished.Reset(); + _dataReceived.Reset(); + } +} + +@end + +namespace web { +namespace download { +namespace internal { +namespace { + +// Asynchronously returns cookies for |context_getter|. Must be called on IO +// thread (due to URLRequestContextGetter thread-affinity). The callback will +// be called on the IO thread too. void GetCookiesFromContextGetter( scoped_refptr<net::URLRequestContextGetter> context_getter, base::OnceCallback<void(NSArray<NSHTTPCookie*>*)> callback) { @@ -96,212 +190,213 @@ .Then(std::move(callback))); } -} // namespace - -// NSURLSessionDataDelegate that forwards data and properties task updates to -// the client. Client of this delegate can pass blocks to receive the updates. -@interface CRWURLSessionDelegate : NSObject <NSURLSessionDataDelegate> - -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithTaskRunner:(scoped_refptr<base::TaskRunner>)taskRunner - dataCallback:(DataCallback)dataCallback - doneCallback:(DoneCallback)doneCallback - NS_DESIGNATED_INITIALIZER; -@end - -@implementation CRWURLSessionDelegate { - scoped_refptr<base::TaskRunner> _taskRunner; - DataCallback _dataCallback; - DoneCallback _doneCallback; +// Creates a new file at `path` open for writing. If a file already exists, +// it will be overwritten. The newly created file object is returned. This +// function helps create the file on a background sequence. +base::File CreateFile(base::FilePath path) { + DCHECK(!path.empty()); + return base::File(path, + base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); } -- (instancetype)initWithTaskRunner:(scoped_refptr<base::TaskRunner>)taskRunner - dataCallback:(DataCallback)dataCallback - doneCallback:(DoneCallback)doneCallback { - DCHECK(taskRunner); - DCHECK(!dataCallback.is_null()); - DCHECK(!doneCallback.is_null()); - if ((self = [super init])) { - _taskRunner = std::move(taskRunner); - _dataCallback = std::move(dataCallback); - _doneCallback = std::move(doneCallback); - } - return self; +// Closes `file`. This function helps closing the file on the background +// sequence. +void CloseFile(base::File file) { + file.Close(); } -- (void)URLSession:(NSURLSession*)session - task:(NSURLSessionTask*)task - didCompleteWithError:(NSError*)error { - _taskRunner->PostTask(FROM_HERE, base::BindOnce(_doneCallback, task, error)); -} +// This structure is used to pass the result of WriteDataHelper function back +// to the caller. In case of error, the file will be closed and `bytes_written` +// will be -1 (the error code can be found via `base::File::error_details()`). +struct WriteDataResult { + base::File file; + int64_t bytes_written; +}; -- (void)URLSession:(NSURLSession*)session - dataTask:(NSURLSessionDataTask*)task - didReceiveData:(NSData*)data { - // net::URLFetcherFileWriter does not support trying to write data when - // a previous write is still pending. As this callback is called on a - // background queue, block it until the write has completed on the IO - // thread (in net::URLFetcherFileWriter::Write()). - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); +WriteDataResult WriteDataHelper(base::File file, NSArray<NSData*>* array) { + int64_t bytes_written = 0; + for (NSData* data in array) { + base::span<const uint8_t> span = + base::make_span(static_cast<const uint8_t*>(data.bytes), data.length); - _taskRunner->PostTask( - FROM_HERE, - base::BindOnce( - [](dispatch_semaphore_t semaphore, DataCallback innerDataCallback, - NSURLSessionTask* task, NSData* data) { - if (innerDataCallback.IsCancelled()) { - // If the callback is cancelled, then signal the semaphore to - // allow the background queue to resume its progress. Cancel - // the task to avoid unnecessarily consuming data from user. - dispatch_semaphore_signal(semaphore); + // base::File does not set `error_details()` when write fails, but it + // guarantee that `GetLastFileError()` will return the correct value. + // In case of failure create a `base::File` to transmit the error code. + if (!file.WriteAtCurrentPosAndCheck(span)) { + base::File error_file(base::File::GetLastFileError()); + return WriteDataResult{std::move(error_file), -1}; + } - [task cancel]; - return; - } - - innerDataCallback.Run(task, data, ^() { - // Data was written to disk, unblock queue to read the - // next chunk of downloaded data. - dispatch_semaphore_signal(semaphore); - }); - }, - semaphore, _dataCallback, task, data)); - - // Block this background queue until the the data is written. - dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); -} - -- (void)URLSession:(NSURLSession*)session - didReceiveChallenge:(NSURLAuthenticationChallenge*)challenge - completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, - NSURLCredential*))handler { - // TODO(crbug.com/780911): use CRWCertVerificationController to get - // CertAcceptPolicy for this |challenge|. - handler(NSURLSessionAuthChallengeRejectProtectionSpace, nil); -} - -@end - -namespace web { - -DownloadSessionTaskImpl::DownloadSessionTaskImpl( - WebState* web_state, - const GURL& original_url, - NSString* http_method, - const std::string& content_disposition, - int64_t total_bytes, - const std::string& mime_type, - NSString* identifier, - const scoped_refptr<base::SequencedTaskRunner>& task_runner, - SessionFactory session_factory) - : DownloadTaskImpl(web_state, - original_url, - http_method, - content_disposition, - total_bytes, - mime_type, - identifier, - task_runner), - session_factory_(std::move(session_factory)) { - DCHECK(!original_url_.SchemeIs(url::kDataScheme)); -} - -DownloadSessionTaskImpl::~DownloadSessionTaskImpl() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - [session_task_ cancel]; - session_task_ = nil; -} - -NSData* DownloadSessionTaskImpl::GetResponseData() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(writer_); - net::URLFetcherStringWriter* string_writer = writer_->AsStringWriter(); - if (string_writer) { - const std::string& data = string_writer->data(); - return [NSData dataWithBytes:data.c_str() length:data.size()]; + bytes_written += data.length; } - net::URLFetcherFileWriter* file_writer = writer_->AsFileWriter(); - if (file_writer) { - const base::FilePath& path = file_writer->file_path(); - return [NSData - dataWithContentsOfFile:base::SysUTF8ToNSString(path.AsUTF8Unsafe())]; - } - - return nil; + return WriteDataResult{std::move(file), bytes_written}; } -const base::FilePath& DownloadSessionTaskImpl::GetResponsePath() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(writer_); - net::URLFetcherFileWriter* file_writer = writer_->AsFileWriter(); - if (file_writer) { - const base::FilePath& path = file_writer->file_path(); - return path; - } - - static const base::FilePath kEmptyPath; - return kEmptyPath; +// Move the `base::File` out of `optional` and reset the `optional` to have +// no value (i.e. to be equal to `absl::nullopt`). +base::File take(absl::optional<base::File>& optional) { + DCHECK(optional.has_value()); + base::File value = std::move(optional.value()); + optional = absl::nullopt; + return value; } -void DownloadSessionTaskImpl::Start(const base::FilePath& path, - Destination destination_hint) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DownloadTaskImpl::Start(path, destination_hint); - if (destination_hint == Destination::kToMemory) { - OnWriterInitialized(std::make_unique<net::URLFetcherStringWriter>(), - net::OK); - } else { - DCHECK(path != base::FilePath()); - auto writer = - std::make_unique<net::URLFetcherFileWriter>(task_runner_, path); - net::URLFetcherFileWriter* writer_ptr = writer.get(); - writer_ptr->Initialize( - base::BindOnce(&DownloadSessionTaskImpl::OnWriterInitialized, - weak_factory_.GetWeakPtr(), std::move(writer))); - } -} +} // anonymous namespace -void DownloadSessionTaskImpl::Cancel() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - [session_task_ cancel]; - session_task_ = nil; - DownloadTaskImpl::Cancel(); -} +// Helper class that manages a NSURLSession* and a NSURLSessionTask* to +// perform the download on a background sequence. The object itself has +// sequence-affinity. +// +// This is a separate object as it allow to simplify the logic of the +// DownloadSessionTaskImpl by moving the interactions with NSURLSession, +// NSURLSessionTask and writing to a file to a single object. +// +// DownloadSessionTaskImpl can simply destroy this object to cancel a +// download in progress, knowing that the session will be cancelled and +// the downloaded data deleted if not complete. +// +// The NSURLSession perform the download on a background queue, and the +// data is written to the disk on a background sequence. This means that +// the code in this class needs to interact with three sequences: +// +// 1. NSURLSession queue: +// +// Receive data from the network and invoke it's delegate method +// -URLSession:dataTask:didReceiveData: (when receiving data) or +// -URLSession:task:didCompleteWithError: (when task complete). +// +// The delegate invokes the correct callback. Those callbacks are +// created with base::BindPostTask(...) and thus will be invoked +// on the Session's sequence. The DataReceived or TaskTerminated +// method will be called depending on the delegate method called. +// +// 2. Session sequence: +// +// +// This is the same sequence as the DownloadSessionTaskImpl* that +// owns the Session instance, so it is always safe to call method +// on `owner_`. +// +// - If TaskTerminated is invoked: +// +// The error_code from the download will be propagated to the +// owning DownloadSessionTaskImpl. The Session instance will +// have ensured it has been deleted by this point, and thus +// that the NSURLSession cancelled. +// +// If there is a write in progress (i.e. `file_` is empty) or +// pending (i.e. `pending_` is not nil), then if the download +// was a success, the Session will wait until all the data has +// been written. In case of error, there is no need to wait +// for the write to complete and DownloadSessionTaskImpl can +// be immediately notified of the failure. +// +// - If DataReceived is invoked: +// +// Depending on whether a write is in progress, the `file_` will +// either be non-empty (no write in progress) or empty. If empty, +// the data will be queued in `pending_`, otherwise a new write +// will be initiated on the background queue. +// +// - If DataWritten is invoked: +// +// This means that a write has completed either successfully or +// in error. In case of failure, the DownloadSessiontTaskImpl is +// notified of the failure. In case of success, if there is any +// pending data to write, a new write will be scheduled. If not, +// the `base::File` will be stored back to `file_`. +// +// 3. Background sequence: +// +// The write requests are performed on that sequence. They are +// scheduled by extracting the `base::File` from `file_`, and +// posting a task running `WriteDataHelper` on the background +// sequence (via `task_runner_`). +// +// As long as a write is in progress, `file_` of the instance +// will be empty (which means that any data received from the +// NSURLSession will be enqueued to `pending_`. +// +// The task is configured to invoke DataWritten when the write +// is complete, passing back the `base::File` object and the +// amount of data written (the `file` may have been closed and +// marked in error if the write failed, e.g. due to lack of +// disk space). +// +class Session { + public: + Session(base::File file, + const GURL& url, + NSString* identifier, + NSString* http_method, + NSArray<NSHTTPCookie*>* cookies, + DownloadSessionTaskImpl::SessionFactory session_factory, + const scoped_refptr<base::SequencedTaskRunner>& task_runner, + DownloadSessionTaskImpl* owner); -void DownloadSessionTaskImpl::OnWriterDownloadFinished(int error_code) { - // If downloads manager's flag is enabled, keeps the downloaded file. The - // writer deletes it if it owns it, that's why it shouldn't owns it anymore - // when the current download is finished. - // Check if writer_->AsFileWriter() is necessary because in some cases the - // writer isn't a fileWriter as for PaFGsskit downloads for example. - if (writer_->AsFileWriter()) - writer_->AsFileWriter()->DisownFile(); - session_task_ = nil; - DownloadTaskImpl::OnDownloadFinished(DownloadResult(error_code)); -} + Session(const Session&) = delete; + Session& operator=(const Session&) = delete; -void DownloadSessionTaskImpl::OnWriterInitialized( - std::unique_ptr<net::URLFetcherResponseWriter> writer, - int writer_initialization_status) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(state_, State::kInProgress); - writer_ = std::move(writer); - DCHECK(writer_); + ~Session(); - if (writer_initialization_status != net::OK) { - OnWriterDownloadFinished(writer_initialization_status); - } else { - GetCookies(base::BindRepeating(&DownloadSessionTaskImpl::StartWithCookies, - weak_factory_.GetWeakPtr())); - } -} + private: + // Invoked when data is received from the NSURLSessionTask. + void DataReceived(NSData* data, TaskInfo task_info); -NSURLSession* DownloadSessionTaskImpl::CreateSession( - NSString* identifier, - NSArray<NSHTTPCookie*>* cookies) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(identifier.length); + // Invoked when the NSURLSessionTask is complete with `error_code`. + void TaskFinished(int error_code, TaskInfo task_info); + + // Invoked when data has been written to disk. The `result` object + // will contains the base::File object (possibly in error). + void DataWritten(WriteDataResult result); + + // Helper method to write multiple NSData* objects to `file`. + void WriteData(base::File file, NSArray<NSData*>* array); + + // Cancels the NSURLSession and cleanup related objects. + void CancelSession(); + + SEQUENCE_CHECKER(sequence_checker_); + + // Used to manage the write requests. Depending on whether `file_` is + // empty or not, the data is enqueued in `pending_` or a new task is + // posted to the background sequence using `task_runner_`. + scoped_refptr<base::SequencedTaskRunner> task_runner_; + absl::optional<base::File> file_; + NSMutableArray<NSData*>* pending_ = nil; + + // Stores the error code received from `TaskFinished`. + absl::optional<int> error_code_; + + // References to the NSURLSession and NSURLSessionTask used to perform + // the download in the background. + __strong NSURLSession* session_ = nil; + __strong NSURLSessionTask* task_ = nil; + __strong CRWURLSessionDelegate* delegate_ = nil; + + // Pointer to the DownloadSessionTaskImpl that owns the Session instance. + // Using a raw pointer is safe as the Session object will never outlive + // the DownloadSessionTaskImpl instance. + DownloadSessionTaskImpl* owner_ = nullptr; + + // The delegate methods are invoked on a background queue managed by + // the iOS runtime. The callbacks passed to the delegate use a weak + // pointer to ensure safety. + base::WeakPtrFactory<Session> weak_factory_{this}; +}; + +Session::Session(base::File file, + const GURL& url, + NSString* identifier, + NSString* http_method, + NSArray<NSHTTPCookie*>* cookies, + DownloadSessionTaskImpl::SessionFactory session_factory, + const scoped_refptr<base::SequencedTaskRunner>& task_runner, + DownloadSessionTaskImpl* owner) + : task_runner_(task_runner), file_(std::move(file)), owner_(owner) { + DCHECK(owner_); + DCHECK(file_.has_value() && file_.value().IsValid()); NSURLSessionConfiguration* configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier]; @@ -326,155 +421,291 @@ base::SysUTF8ToNSString(user_agent), }; - base::WeakPtr<DownloadSessionTaskImpl> weak_this = weak_factory_.GetWeakPtr(); - DataCallback data_callback = - base::BindRepeating(&DownloadSessionTaskImpl::OnTaskData, weak_this); - DoneCallback done_callback = - base::BindRepeating(&DownloadSessionTaskImpl::OnTaskDone, weak_this); + // Invoked when data is received from NSURLSessionTask. + DataReceivedHandler data_received = base::BindPostTask( + base::SequencedTaskRunnerHandle::Get(), + base::BindRepeating(&Session::DataReceived, weak_factory_.GetWeakPtr())); - id<NSURLSessionDataDelegate> session_delegate = [[CRWURLSessionDelegate alloc] - initWithTaskRunner:base::SequencedTaskRunnerHandle::Get() - dataCallback:std::move(data_callback) - doneCallback:std::move(done_callback)]; + // Invoked when NSURLSessionTask complete. + TaskFinishedHandler task_finished = base::BindPostTask( + base::SequencedTaskRunnerHandle::Get(), + base::BindRepeating(&Session::TaskFinished, weak_factory_.GetWeakPtr())); - if (!session_factory_.is_null()) { - return session_factory_.Run(configuration, session_delegate); + // The delegate passed to NSURLSession. It is strongly retained by the + // NSURLSession, so there is no need to retain it by this Session object. + // The delegate will be invoked for all events for any NSURLSessionTask + // created with the NSURLSession and is the reason why NSURLSession are + // not re-used (as otherwise it is possible for the delegate to be called + // for download that DownloadSessionTaskImpl consider as cancelled). + delegate_ = [[CRWURLSessionDelegate alloc] + initWithDataReceivedHandler:std::move(data_received) + taskFinishedHandler:std::move(task_finished)]; + + if (!session_factory.is_null()) { + session_ = session_factory.Run(configuration, delegate_); + DCHECK(session_) << "session_factory must not return nil!"; + } else { + session_ = [NSURLSession sessionWithConfiguration:configuration + delegate:delegate_ + delegateQueue:nil]; } - return [NSURLSession sessionWithConfiguration:configuration - delegate:session_delegate - delegateQueue:nil]; + NSMutableURLRequest* request = + [[NSMutableURLRequest alloc] initWithURL:net::NSURLWithGURL(url)]; + request.HTTPMethod = http_method; + + task_ = [session_ dataTaskWithRequest:request]; + [task_ resume]; } -void DownloadSessionTaskImpl::GetCookies( - base::OnceCallback<void(NSArray<NSHTTPCookie*>*)> callback) { +Session::~Session() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - scoped_refptr<net::URLRequestContextGetter> context_getter( - web_state_->GetBrowserState()->GetRequestContext()); + CancelSession(); - // net::URLRequestContextGetter must be used in the IO thread. + // Close the file on the background sequence if it is still open. This + // is a best effort. + if (file_.has_value()) { + base::File file = take(file_); + task_runner_->PostTask(FROM_HERE, + base::BindOnce(&CloseFile, std::move(file))); + } +} + +void Session::DataReceived(NSData* data, TaskInfo task_info) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(data); + + owner_->ApplyTaskInfo(std::move(task_info)); + + if (file_.has_value()) { + WriteData(take(file_), @[ data ]); + return; + } + + if (!pending_) { + pending_ = [[NSMutableArray alloc] init]; + } + [pending_ addObject:data]; +} + +void Session::TaskFinished(int error_code, TaskInfo task_info) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + owner_->ApplyTaskInfo(std::move(task_info)); + CancelSession(); + + if (pending_ || !file_.has_value()) { + DCHECK(!error_code_.has_value()); + error_code_ = error_code; + } else { + DCHECK(file_.has_value()); + base::File file = take(file_); + task_runner_->PostTaskAndReply( + FROM_HERE, base::BindOnce(&CloseFile, std::move(file)), + base::BindOnce(&DownloadSessionTaskImpl::OnDownloadFinished, + owner_->weak_factory_.GetWeakPtr(), + DownloadResult(error_code))); + } +} + +void Session::DataWritten(WriteDataResult result) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!file_.has_value()); + + if (!result.file.IsValid()) { + CancelSession(); + + int error_code = net::FileErrorToNetError(result.file.error_details()); + owner_->OnDownloadFinished(DownloadResult(error_code)); + return; + } + + if (pending_) { + DCHECK_GT(pending_.count, 0u); + NSMutableArray<NSData*>* array = nil; + std::swap(array, pending_); + + WriteData(std::move(result.file), array); + } else { + file_ = std::move(result.file); + } + + // No write pending and download complete, close the file, then notify the + // DownloadSessionTaskImpl about the download completion. Do this before + // calling `OnDownloadUpdated()` since the DownloadTaskImpl may be deleted + // synchronously by one of the observer. + if (file_.has_value() && error_code_.has_value()) { + base::File file = take(file_); + task_runner_->PostTaskAndReply( + FROM_HERE, base::BindOnce(&CloseFile, std::move(file)), + base::BindOnce(&DownloadSessionTaskImpl::OnDownloadFinished, + owner_->weak_factory_.GetWeakPtr(), + DownloadResult(error_code_.value()))); + } + + owner_->OnDataWritten(result.bytes_written); + owner_->OnDownloadUpdated(); +} + +void Session::WriteData(base::File file, NSArray<NSData*>* array) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(file.IsValid()); + + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&WriteDataHelper, std::move(file), array), + base::BindOnce(&Session::DataWritten, weak_factory_.GetWeakPtr())); +} + +void Session::CancelSession() { + // Stop the delegate so that it stop forwarding events to this instance. + // Do this before cancelling the NSURLSession as otherwise it may lead + // to invoking the TaskFinished() method via the callback. + + [delegate_ stop]; + delegate_ = nil; + + [session_ invalidateAndCancel]; + session_ = nil; + + [task_ cancel]; + task_ = nil; +} + +} // namespace internal +} // namespace download + +DownloadSessionTaskImpl::DownloadSessionTaskImpl( + WebState* web_state, + const GURL& original_url, + NSString* http_method, + const std::string& content_disposition, + int64_t total_bytes, + const std::string& mime_type, + NSString* identifier, + const scoped_refptr<base::SequencedTaskRunner>& task_runner, + DownloadSessionTaskImpl::SessionFactory session_factory) + : DownloadTaskImpl(web_state, + original_url, + http_method, + content_disposition, + total_bytes, + mime_type, + identifier, + task_runner), + session_factory_(std::move(session_factory)) { + DCHECK(!original_url_.SchemeIs(url::kDataScheme)); +} + +DownloadSessionTaskImpl::~DownloadSessionTaskImpl() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CancelInternal(); +} + +void DownloadSessionTaskImpl::StartInternal(const base::FilePath& path) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!path.empty()); + + // Ensure that any previous session has been invalidated. + CancelInternal(); + + using download::internal::CreateFile; + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&CreateFile, path), + base::BindOnce(&DownloadSessionTaskImpl::OnFileCreated, + weak_factory_.GetWeakPtr())); +} + +void DownloadSessionTaskImpl::CancelInternal() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + weak_factory_.InvalidateWeakPtrs(); + session_.reset(); +} + +void DownloadSessionTaskImpl::OnFileCreated(base::File file) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (!file.IsValid()) { + // Calling `OnDownloadFinished()` may cause the task to be deleted, + // so this must no longer be accessed after that point. + OnDownloadFinished( + DownloadResult(net::FileErrorToNetError(file.error_details()))); + + return; + } + + scoped_refptr<net::URLRequestContextGetter> context_getter = + web_state_->GetBrowserState()->GetRequestContext(); + + // net::URLRequestContextGetter must be used on the IO thread. + using download::internal::GetCookiesFromContextGetter; GetIOThreadTaskRunner({})->PostTask( FROM_HERE, - base::BindOnce(&GetCookiesFromContextGetter, context_getter, - base::BindPostTask(base::SequencedTaskRunnerHandle::Get(), - std::move(callback)))); + base::BindOnce( + &GetCookiesFromContextGetter, context_getter, + base::BindPostTask( + base::SequencedTaskRunnerHandle::Get(), + base::BindOnce(&DownloadSessionTaskImpl::OnCookiesFetched, + weak_factory_.GetWeakPtr(), std::move(file))))); } -void DownloadSessionTaskImpl::StartWithCookies( +void DownloadSessionTaskImpl::OnCookiesFetched( + base::File file, NSArray<NSHTTPCookie*>* cookies) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(writer_); + DCHECK(file.IsValid()); - if (!session_) { - session_ = CreateSession(identifier_, cookies); - DCHECK(session_); - } + // Creating the Session object automatically starts the download. + using download::internal::Session; + session_ = std::make_unique<Session>( + std::move(file), GetOriginalUrl(), GetIdentifier(), GetHttpMethod(), + cookies, session_factory_, task_runner_, this); - has_performed_background_download_ = - UIApplication.sharedApplication.applicationState != - UIApplicationStateActive; - - NSURL* url = net::NSURLWithGURL(GetOriginalUrl()); - NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url]; - request.HTTPMethod = GetHttpMethod(); - session_task_ = [session_ dataTaskWithRequest:request]; - [session_task_ resume]; OnDownloadUpdated(); } -void DownloadSessionTaskImpl::OnTaskDone(NSURLSessionTask* task, - NSError* error) { +void DownloadSessionTaskImpl::ApplyTaskInfo( + download::internal::TaskInfo task_info) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (task != session_task_) { - [task cancel]; - return; + if (total_bytes_ == -1 || task_info.total_bytes() > 0) { + // NSURLSessionTask -countOfBytesExpectedToReceive can be 0 if the device + // is offline. In that case, total_bytes_ should remain unchanged if the + // total bytes count is already known. + total_bytes_ = task_info.total_bytes(); } - download_result_ = DownloadResult( - GetNetErrorCodeFromNSError(error, task.currentRequest.URL)); - OnTaskTick(task, /*notify_download_updated*/ false); - - // Forget the current NSURLSessionTask, so that if any other callbacks are - // received they are dropped as calling net::URLFetcherFileWriter::Finish - // put the writer in a invalid state. - session_task_ = nil; - - const int result = writer_->Finish( - download_result_.error_code(), - base::BindOnce(&DownloadSessionTaskImpl::OnWriterDownloadFinished, - weak_factory_.GetWeakPtr())); - - if (result != net::ERR_IO_PENDING) { - OnWriterDownloadFinished(download_result_.error_code()); + if (task_info.http_error_code() != -1) { + http_code_ = task_info.http_error_code(); } + + if (task_info.mime_type().length != 0) { + mime_type_ = base::SysNSStringToUTF8(task_info.mime_type()); + } + + RecomputePercentCompleted(); } -void DownloadSessionTaskImpl::OnTaskData(NSURLSessionTask* task, - NSData* data, - ProceduralBlock completion_handler) { +void DownloadSessionTaskImpl::OnDataWritten(int64_t data_size) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (task != session_task_) { - completion_handler(); - [task cancel]; - return; - } - - scoped_refptr<net::IOBufferWithSize> buffer = - GetBuffer(data.bytes, data.length); - - base::RepeatingClosure inner_closure = base::BindRepeating( - &DownloadSessionTaskImpl::OnTaskTick, weak_factory_.GetWeakPtr(), task, - /*notify_download_updated*/ true); - - // The buffer needs to be kept alive until net::URLFetcherFileWriter::Write - // has completed the write. So capture a reference to the buffer in the bound - // callback. - base::RepeatingCallback<void(int)> write_callback = base::BindRepeating( - [](base::RepeatingClosure inner_closure, ProceduralBlock completion_block, - scoped_refptr<net::IOBuffer> buffer, int result) { - if (!inner_closure.IsCancelled()) { - inner_closure.Run(); - } - completion_block(); - }, - inner_closure, completion_handler, buffer); - - const int result = - writer_->Write(buffer.get(), buffer->size(), write_callback); - - if (result != net::ERR_IO_PENDING) { - write_callback.Run(result); - } + received_bytes_ += data_size; + RecomputePercentCompleted(); } -void DownloadSessionTaskImpl::OnTaskTick(NSURLSessionTask* task, - bool notify_download_updated) { +void DownloadSessionTaskImpl::RecomputePercentCompleted() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (task != session_task_) { - [task cancel]; - return; - } + switch (total_bytes_) { + case 0: + percent_complete_ = 100; + break; - percent_complete_ = GetTaskPercentComplete(task); - received_bytes_ = task.countOfBytesReceived; - if (total_bytes_ == -1 || task.countOfBytesExpectedToReceive) { - // countOfBytesExpectedToReceive can be 0 if the device if offline. - // In that case total_bytes_ should remain unchanged if the total - // bytes count is already known. - total_bytes_ = task.countOfBytesExpectedToReceive; - } + case -1: + percent_complete_ = -1; + break; - if (task.response.MIMEType) { - mime_type_ = base::SysNSStringToUTF8(task.response.MIMEType); - } - - if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) { - http_code_ = - base::mac::ObjCCastStrict<NSHTTPURLResponse>(task.response).statusCode; - } - - if (notify_download_updated) { - OnDownloadUpdated(); + default: + DCHECK_GE(received_bytes_, 0); + DCHECK_LE(received_bytes_, total_bytes_); + percent_complete_ = (100. * received_bytes_) / total_bytes_; + break; } }
diff --git a/ios/web/download/download_session_task_impl_unittest.mm b/ios/web/download/download_session_task_impl_unittest.mm index ce398532..1ad80b6 100644 --- a/ios/web/download/download_session_task_impl_unittest.mm +++ b/ios/web/download/download_session_task_impl_unittest.mm
@@ -65,26 +65,15 @@ base::Unretained(this)))), session_delegate_callbacks_queue_( dispatch_queue_create(nullptr, DISPATCH_QUEUE_SERIAL)) { - DCHECK(!session_); - session_ = OCMStrictClassMock([NSURLSession class]); - browser_state_.SetOffTheRecord(true); browser_state_.SetCookieStore(std::make_unique<FakeCookieStore>()); web_state_.SetBrowserState(&browser_state_); } // Starts the download and return NSURLSessionDataTask fake for this task. - CRWFakeNSURLSessionTask* Start(const base::FilePath& path, - DownloadTask::Destination destination_hint) { - // Inject fake NSURLSessionDataTask into DownloadTaskImpl. - NSURL* url = [NSURL URLWithString:@(kUrl)]; - session_task_ = [[CRWFakeNSURLSessionTask alloc] initWithURL:url]; - NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url]; - request.HTTPMethod = kHttpMethod; - OCMExpect([session_ dataTaskWithRequest:request]).andReturn(session_task_); - + CRWFakeNSURLSessionTask* Start(const base::FilePath& path) { web::test::WaitDownloadTaskUpdated observer(task_.get()); - task_->Start(path, destination_hint); + task_->Start(path); observer.Wait(); DCHECK(session_task_); @@ -99,9 +88,7 @@ // Starts the download and return NSURLSessionDataTask fake for this task. // Same as above, but uses URLFetcherStringWriter as response writer. - CRWFakeNSURLSessionTask* Start() { - return Start(base::FilePath(), DownloadTask::Destination::kToMemory); - } + CRWFakeNSURLSessionTask* Start() { return Start(base::FilePath()); } // Session and session delegate injected into DownloadTaskImpl for testing. NSURLSession* session() { return session_; } @@ -146,6 +133,15 @@ NSURLSession* CreateSession(NSURLSessionConfiguration* configuration, id<NSURLSessionDataDelegate> delegate) { + session_ = OCMStrictClassMock([NSURLSession class]); + + // Inject fake NSURLSessionDataTask into DownloadTaskImpl. + NSURL* url = [NSURL URLWithString:@(kUrl)]; + session_task_ = [[CRWFakeNSURLSessionTask alloc] initWithURL:url]; + NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url]; + request.HTTPMethod = kHttpMethod; + OCMExpect([session_ dataTaskWithRequest:request]).andReturn(session_task_); + session_configuration_ = configuration; session_delegate_ = delegate; @@ -216,11 +212,6 @@ EXPECT_EQ(0, task_->GetErrorCode()); EXPECT_EQ(-1, task_->GetTotalBytes()); EXPECT_EQ(-1, task_->GetPercentComplete()); - EXPECT_NSEQ( - @(kData), - [[NSString alloc] - initWithData:web::test::GetDownloadTaskResponseData(task_.get()) - encoding:NSUTF8StringEncoding]); // Download has finished. int64_t kDataSize = strlen(kData); @@ -294,11 +285,6 @@ EXPECT_EQ(kDataSize, task_->GetTotalBytes()); EXPECT_EQ(kDataSize, task_->GetReceivedBytes()); EXPECT_EQ(100, task_->GetPercentComplete()); - EXPECT_NSEQ( - @(kData), - [[NSString alloc] - initWithData:web::test::GetDownloadTaskResponseData(task_.get()) - encoding:NSUTF8StringEncoding]); // Download has finished. SimulateDownloadCompletion(session_task); @@ -333,11 +319,6 @@ EXPECT_EQ(kData1Size + kData2Size, task_->GetTotalBytes()); EXPECT_EQ(kData1Size, task_->GetReceivedBytes()); EXPECT_EQ(42, task_->GetPercentComplete()); - EXPECT_NSEQ( - @(kData1), - [[NSString alloc] - initWithData:web::test::GetDownloadTaskResponseData(task_.get()) - encoding:NSUTF8StringEncoding]); // The second part of the response has arrived. SimulateDataDownload(session_task, kData2); @@ -347,11 +328,6 @@ EXPECT_EQ(kData1Size + kData2Size, task_->GetTotalBytes()); EXPECT_EQ(kData1Size + kData2Size, task_->GetReceivedBytes()); EXPECT_EQ(100, task_->GetPercentComplete()); - EXPECT_NSEQ( - [@(kData1) stringByAppendingString:@(kData2)], - [[NSString alloc] - initWithData:web::test::GetDownloadTaskResponseData(task_.get()) - encoding:NSUTF8StringEncoding]); // Download has finished. SimulateDownloadCompletion(session_task); @@ -403,11 +379,6 @@ EXPECT_EQ(kExpectedDataSize, task_->GetTotalBytes()); EXPECT_EQ(kReceivedDataSize, task_->GetReceivedBytes()); EXPECT_EQ(23, task_->GetPercentComplete()); - EXPECT_NSEQ( - @(kReceivedData), - [[NSString alloc] - initWithData:web::test::GetDownloadTaskResponseData(task_.get()) - encoding:NSUTF8StringEncoding]); // Download has failed. NSError* error = [NSError errorWithDomain:NSURLErrorDomain @@ -416,10 +387,10 @@ session_task.countOfBytesExpectedToReceive = 0; // This is 0 when offline. SimulateDownloadCompletion(session_task, error); EXPECT_EQ(DownloadTask::State::kFailed, task_->GetState()); - EXPECT_TRUE(task_->GetErrorCode() == net::ERR_INTERNET_DISCONNECTED); + EXPECT_EQ(task_->GetErrorCode(), net::ERR_INTERNET_DISCONNECTED); EXPECT_EQ(kExpectedDataSize, task_->GetTotalBytes()); EXPECT_EQ(kReceivedDataSize, task_->GetReceivedBytes()); - EXPECT_EQ(100, task_->GetPercentComplete()); + EXPECT_EQ(23, task_->GetPercentComplete()); EXPECT_NSEQ( @(kReceivedData), [[NSString alloc] @@ -469,8 +440,7 @@ ASSERT_FALSE(base::PathExists(temp_file)); // Start the download. - CRWFakeNSURLSessionTask* session_task = - Start(temp_file, web::DownloadTask::Destination::kToDisk); + CRWFakeNSURLSessionTask* session_task = Start(temp_file); ASSERT_TRUE(session_task); // Deliver the response and verify that download file exists.
diff --git a/ios/web/download/download_task_impl.h b/ios/web/download/download_task_impl.h index 09bfddd..e72b77e 100644 --- a/ios/web/download/download_task_impl.h +++ b/ios/web/download/download_task_impl.h
@@ -22,6 +22,11 @@ } // namespace base namespace web { +namespace download { +namespace internal { +struct CreateFileResult; +} // namespace internal +} // namespace download class DownloadTaskObserver; class WebState; @@ -41,33 +46,53 @@ NSString* identifier, const scoped_refptr<base::SequencedTaskRunner>& task_runner); - // DownloadTask overrides: - WebState* GetWebState() override; - DownloadTask::State GetState() const override; - void Start(const base::FilePath& path, Destination destination_hint) override; - void Cancel() override; - NSString* GetIdentifier() const override; - const GURL& GetOriginalUrl() const override; - NSString* GetHttpMethod() const override; - bool IsDone() const override; - int GetErrorCode() const override; - int GetHttpCode() const override; - int64_t GetTotalBytes() const override; - int64_t GetReceivedBytes() const override; - int GetPercentComplete() const override; - std::string GetContentDisposition() const override; - std::string GetOriginalMimeType() const override; - std::string GetMimeType() const override; - base::FilePath GenerateFileName() const override; - bool HasPerformedBackgroundDownload() const override; - void AddObserver(DownloadTaskObserver* observer) override; - void RemoveObserver(DownloadTaskObserver* observer) override; - ~DownloadTaskImpl() override; + // DownloadTask overrides: + WebState* GetWebState() final; + DownloadTask::State GetState() const final; + void Start(const base::FilePath& path) final; + void Cancel() final; + NSString* GetIdentifier() const final; + const GURL& GetOriginalUrl() const final; + NSString* GetHttpMethod() const final; + bool IsDone() const final; + int GetErrorCode() const final; + int GetHttpCode() const final; + int64_t GetTotalBytes() const final; + int64_t GetReceivedBytes() const final; + int GetPercentComplete() const final; + std::string GetContentDisposition() const final; + std::string GetOriginalMimeType() const final; + std::string GetMimeType() const final; + base::FilePath GenerateFileName() const final; + bool HasPerformedBackgroundDownload() const final; + void AddObserver(DownloadTaskObserver* observer) final; + void RemoveObserver(DownloadTaskObserver* observer) final; + void GetResponseData(ResponseDataReadCallback callback) const final; + const base::FilePath& GetResponsePath() const final; + private: + // Needs to be overridden by sub-classes to perform the download. When this + // method is invoked, `path` is non-empty, its parent directory exists, the + // location is writable, but the file does not exist. + virtual void StartInternal(const base::FilePath& path) = 0; + + // Needs to be overridden by sub-classes to clean themselves when the + // download is cancelled. If they need to clean during their shutdown, + // then they need to call `CancelInternal()` from their destructor. + virtual void CancelInternal() = 0; + + // Can be overridden by sub-classes to return a suggested name for the + // downloaded file. The default implementation returns an empty string. virtual std::string GetSuggestedName() const; + // Invoked when UIApplicationWillResignActiveNotification is received. + void OnAppWillResignActive(); + + // Invoked asynchronously when the file has been created. + void OnDownloadFileCreated(download::internal::CreateFileResult result); + protected: // Called when download was completed and the data writing was finished. void OnDownloadFinished(DownloadResult download_result); @@ -97,6 +122,9 @@ DownloadResult download_result_; WebState* web_state_ = nullptr; + base::FilePath path_; + bool owns_file_ = false; + scoped_refptr<base::SequencedTaskRunner> task_runner_; // Observes UIApplicationWillResignActiveNotification notifications.
diff --git a/ios/web/download/download_task_impl.mm b/ios/web/download/download_task_impl.mm index 2d3e1544..778bb7f 100644 --- a/ios/web/download/download_task_impl.mm +++ b/ios/web/download/download_task_impl.mm
@@ -6,18 +6,106 @@ #import <WebKit/WebKit.h> +#import <limits> + +#import "base/bind.h" +#import "base/files/file.h" +#import "base/files/file_util.h" #import "base/strings/sys_string_conversions.h" +#import "base/task/bind_post_task.h" #import "base/task/sequenced_task_runner.h" +#import "base/threading/sequenced_task_runner_handle.h" #import "ios/web/download/download_result.h" #import "ios/web/public/download/download_task_observer.h" #import "ios/web/public/web_state.h" #import "net/base/filename_util.h" +#import "net/base/net_errors.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif namespace web { +namespace download { +namespace internal { + +// Helper struct that store the error code and the opened file object (in case +// of success). +struct CreateFileResult { + int net_error_code = net::OK; + base::FilePath file_path; + + explicit CreateFileResult(int error_code) : net_error_code(error_code) { + DCHECK_NE(net_error_code, net::OK); + } + + explicit CreateFileResult(base::FilePath path) : file_path(std::move(path)) { + DCHECK(!file_path.empty()); + } + + CreateFileResult(CreateFileResult&& other) = default; + CreateFileResult& operator=(CreateFileResult&& other) = default; + + ~CreateFileResult() = default; +}; + +namespace { + +CreateFileResult CreateFileForDownload(base::FilePath path) { + if (path.empty()) { + if (!base::CreateTemporaryFile(&path)) { + return CreateFileResult( + net::MapSystemError(logging::GetLastSystemErrorCode())); + } + DCHECK(!path.empty()); + } else { + base::File::Error error; + if (!base::CreateDirectoryAndGetError(path.DirName(), &error)) { + return CreateFileResult(net::FileErrorToNetError(error)); + } + } + + // If `path` exists and is a directory, fail with an error as we don't + // want the download task to delete an existing directory. + if (base::DirectoryExists(path)) { + return CreateFileResult(net::ERR_ACCESS_DENIED); + } + + // Try to delete any existing file at `path` (deleting a non-existent + // file is not an error for `base::DeleteFile(...)`). This is needed + // as some sub-classes of DownloadTaskImpl fail if the destination + // file already exists. + if (!base::DeleteFile(path)) { + return CreateFileResult( + net::MapSystemError(logging::GetLastSystemErrorCode())); + } + + return CreateFileResult(std::move(path)); +} + +NSData* ReadDataFromFile(base::FilePath path, int64_t bytes) { + // base::ReadFile uses int for the count value, so it will fail if we + // try to read more than INT_MAX bytes. Given that this is already 2GB + // and we can't allocate that much memory, there is no point trying to + // read the data in 2GB chunks, instead just fail. + if (bytes < 0 || std::numeric_limits<int>::max() < bytes) { + return nil; + } + + const int bytes_to_read = static_cast<int>(bytes); + NSMutableData* data = [NSMutableData dataWithLength:bytes]; + char* buffer = static_cast<char*>(data.mutableBytes); + + if (base::ReadFile(path, buffer, bytes_to_read) != bytes_to_read) { + return nil; + } + + return [data copy]; +} + +} // anonymous namespace +} // namespace internal +} // namespace download DownloadTaskImpl::DownloadTaskImpl( WebState* web_state, @@ -40,18 +128,18 @@ DCHECK(web_state_); DCHECK(task_runner_); + base::RepeatingClosure closure = base::BindPostTask( + base::SequencedTaskRunnerHandle::Get(), + base::BindRepeating(&DownloadTaskImpl::OnAppWillResignActive, + weak_factory_.GetWeakPtr())); + base::WeakPtr<DownloadTaskImpl> weak_Task = weak_factory_.GetWeakPtr(); observer_ = [NSNotificationCenter.defaultCenter addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:nil usingBlock:^(NSNotification* _Nonnull) { - DownloadTaskImpl* task = weak_Task.get(); - if (task) { - if (task->state_ == State::kInProgress) { - task->has_performed_background_download_ = true; - } - } + closure.Run(); }]; } @@ -60,6 +148,14 @@ [NSNotificationCenter.defaultCenter removeObserver:observer_]; for (auto& observer : observers_) observer.OnDownloadDestroyed(this); + + // Delete the downloaded file if it was a temporary file or if the download + // failed (it is not an error to delete a non-existent file). + if (owns_file_ || state_ != State::kComplete) { + task_runner_->PostTask( + FROM_HERE, + base::BindOnce(base::IgnoreResult(&base::DeleteFile), path_)); + } } WebState* DownloadTaskImpl::GetWebState() { @@ -72,20 +168,26 @@ return state_; } -void DownloadTaskImpl::Start(const base::FilePath& path, - Destination destination_hint) { +void DownloadTaskImpl::Start(const base::FilePath& path) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(path != base::FilePath() || - destination_hint == DownloadTask::Destination::kToMemory); DCHECK_NE(state_, State::kInProgress); + state_ = State::kInProgress; percent_complete_ = 0; received_bytes_ = 0; + owns_file_ = path.empty(); + + using download::internal::CreateFileForDownload; + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&CreateFileForDownload, path), + base::BindOnce(&DownloadTaskImpl::OnDownloadFileCreated, + weak_factory_.GetWeakPtr())); } void DownloadTaskImpl::Cancel() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); state_ = State::kCancelled; + CancelInternal(); OnDownloadUpdated(); } @@ -167,10 +269,6 @@ /*default_name=*/"document"); } -std::string DownloadTaskImpl::GetSuggestedName() const { - return std::string(); -} - bool DownloadTaskImpl::HasPerformedBackgroundDownload() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return has_performed_background_download_; @@ -186,10 +284,44 @@ observers_.RemoveObserver(observer); } -void DownloadTaskImpl::OnDownloadUpdated() { +void DownloadTaskImpl::GetResponseData( + ResponseDataReadCallback callback) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - for (auto& observer : observers_) - observer.OnDownloadUpdated(this); + DCHECK(IsDone()); + using download::internal::ReadDataFromFile; + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&ReadDataFromFile, path_, received_bytes_), + std::move(callback)); +} + +const base::FilePath& DownloadTaskImpl::GetResponsePath() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(IsDone()); + static const base::FilePath kEmptyPath; + return owns_file_ ? kEmptyPath : path_; +} + +std::string DownloadTaskImpl::GetSuggestedName() const { + return std::string(); +} + +void DownloadTaskImpl::OnAppWillResignActive() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (GetState() == DownloadTask::State::kInProgress) { + has_performed_background_download_ = YES; + } +} + +void DownloadTaskImpl::OnDownloadFileCreated( + download::internal::CreateFileResult result) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (result.net_error_code == net::OK) { + path_ = std::move(result.file_path); + StartInternal(path_); + return; + } + + OnDownloadFinished(DownloadResult(result.net_error_code)); } void DownloadTaskImpl::OnDownloadFinished(DownloadResult download_result) { @@ -205,4 +337,10 @@ OnDownloadUpdated(); } +void DownloadTaskImpl::OnDownloadUpdated() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + for (auto& observer : observers_) + observer.OnDownloadUpdated(this); +} + } // namespace web
diff --git a/ios/web/download/download_task_impl_unittest.mm b/ios/web/download/download_task_impl_unittest.mm index 4e3cd9a..144a2dd 100644 --- a/ios/web/download/download_task_impl_unittest.mm +++ b/ios/web/download/download_task_impl_unittest.mm
@@ -35,7 +35,7 @@ } // namespace // Creates a non-virtual class to use for testing -class FakeDownloadTaskImpl : public DownloadTaskImpl { +class FakeDownloadTaskImpl final : public DownloadTaskImpl { public: FakeDownloadTaskImpl( WebState* web_state, @@ -55,15 +55,8 @@ identifier, task_runner) {} - NSData* GetResponseData() const override { return response_data_; } - - const base::FilePath& GetResponsePath() const override { - return response_path_; - } - - private: - base::FilePath response_path_; - __strong NSData* response_data_ = nil; + void StartInternal(const base::FilePath& path) final {} + void CancelInternal() final {} }; // Test fixture for testing DownloadTaskImplTest class. @@ -108,7 +101,7 @@ TEST_F(DownloadTaskImplTest, SuccessfulInitialization) { // Simulates successful download and tests that Start() and // OnDownloadFinished are overloaded correctly - task_->Start(base::FilePath(), web::DownloadTask::Destination::kToMemory); + task_->Start(base::FilePath()); EXPECT_EQ(DownloadTask::State::kInProgress, task_->GetState()); // Tests that Cancel() is overloaded
diff --git a/ios/web/public/download/download_task.h b/ios/web/public/download/download_task.h index 1b1a0016..563b8e8 100644 --- a/ios/web/public/download/download_task.h +++ b/ios/web/public/download/download_task.h
@@ -12,6 +12,7 @@ #include <memory> #include <string> +#include "base/callback_forward.h" #include "ui/base/page_transition_types.h" class GURL; @@ -29,6 +30,7 @@ // stores all the state for a download. Sequence-affine. class DownloadTask { public: + // Possible state of the Download Task. enum class State { // Download has not started yet. kNotStarted = 0, @@ -49,13 +51,9 @@ kFailedNotResumable, }; - enum class Destination { - // Destination hint to tell DownloadTask to write to disk - kToDisk, - - // Destination hint to tell DownloadTask to write to memory - kToMemory, - }; + // Type of the callback invoked when the downloaded data has been read + // from disk. + using ResponseDataReadCallback = base::OnceCallback<void(NSData* data)>; // Returns WebState which requested this download. virtual WebState* GetWebState() = 0; @@ -63,19 +61,23 @@ // Returns the download task state. virtual State GetState() const = 0; - // Starts the download. If |destination_hint| is |kToMemory|, - // then if possible the download will not be written in to a - // file, otherwise |path| must be non-empty and correspond to - // the file where the download will be saved. It is an error - // if the file already exists, or if the parent directory does not. - virtual void Start(const base::FilePath& path, - Destination destination_hint) = 0; + // Starts the download and save it to `path`. If `path` is null, the data + // downloaded will be saved to a temporary location and deleted when the + // task is destroyed. Otherwise, upon success, the ownership of the file + // will be transferred to the caller. The task will take care of creating + // the directory structure required to save the file (or will fail with an + // error if this is not possible). + virtual void Start(const base::FilePath& path) = 0; // Cancels the download. virtual void Cancel() = 0; - // Returns downloaded data, if any. - virtual NSData* GetResponseData() const = 0; + // Reads the downloaded data from the saved path, and call `callback` on + // the calling sequence with it. If the download was done to a temporary + // location, the read will fail if the `DownloadTask` is deleted before + // `callback` is called. In that case, you may want to have the `callback` + // take ownership of the task. + virtual void GetResponseData(ResponseDataReadCallback callback) const = 0; // Returns the path to the downloaded data, if saved to disk. virtual const base::FilePath& GetResponsePath() const = 0;
diff --git a/ios/web/public/test/download_task_test_util.mm b/ios/web/public/test/download_task_test_util.mm index a7683fe..6cbd517 100644 --- a/ios/web/public/test/download_task_test_util.mm +++ b/ios/web/public/test/download_task_test_util.mm
@@ -66,7 +66,18 @@ } NSData* GetDownloadTaskResponseData(DownloadTask* task) { - return task->GetResponseData(); + __block NSData* response_data = nil; + + base::RunLoop run_loop; + task->GetResponseData(base::BindOnce( + ^(base::OnceClosure done_closure, NSData* data) { + response_data = data; + std::move(done_closure).Run(); + }, + run_loop.QuitClosure())); + run_loop.Run(); + + return response_data; } } // namespace test
diff --git a/ios/web/public/test/fakes/fake_download_task.h b/ios/web/public/test/fakes/fake_download_task.h index 801619bc..699cc5a7 100644 --- a/ios/web/public/test/fakes/fake_download_task.h +++ b/ios/web/public/test/fakes/fake_download_task.h
@@ -28,9 +28,9 @@ // DownloadTask finals: WebState* GetWebState() final; DownloadTask::State GetState() const final; - void Start(const base::FilePath& path, Destination destination_hint) final; + void Start(const base::FilePath& path) final; void Cancel() final; - NSData* GetResponseData() const final; + void GetResponseData(ResponseDataReadCallback callback) const final; const base::FilePath& GetResponsePath() const final; NSString* GetIdentifier() const final; const GURL& GetOriginalUrl() const final;
diff --git a/ios/web/public/test/fakes/fake_download_task.mm b/ios/web/public/test/fakes/fake_download_task.mm index 065f48c..e614ef1e 100644 --- a/ios/web/public/test/fakes/fake_download_task.mm +++ b/ios/web/public/test/fakes/fake_download_task.mm
@@ -4,7 +4,6 @@ #import "ios/web/public/test/fakes/fake_download_task.h" -#import "base/strings/sys_string_conversions.h" #import "ios/web/public/download/download_task_observer.h" #import "net/url_request/url_fetcher_response_writer.h" @@ -37,8 +36,7 @@ return state_; } -void FakeDownloadTask::Start(const base::FilePath& path, - Destination destination_hint) { +void FakeDownloadTask::Start(const base::FilePath& path) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); response_data_ = nil; response_path_ = path; @@ -52,9 +50,10 @@ OnDownloadUpdated(); } -NSData* FakeDownloadTask::GetResponseData() const { +void FakeDownloadTask::GetResponseData( + ResponseDataReadCallback callback) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return response_data_; + std::move(callback).Run(response_data_); } const base::FilePath& FakeDownloadTask::GetResponsePath() const {
diff --git a/ios/web/test/fakes/fake_native_task_bridge.h b/ios/web/test/fakes/fake_native_task_bridge.h index c743d4ce..2ced958 100644 --- a/ios/web/test/fakes/fake_native_task_bridge.h +++ b/ios/web/test/fakes/fake_native_task_bridge.h
@@ -10,10 +10,6 @@ // Used to simulate methods in NativeTaskBridge @interface FakeNativeTaskBridge : DownloadNativeTaskBridge -// Used in testing to initialize ivars for a proper fake download and is only -// available in iOS 15+ as it uses |download| -- (void)downloadInitialized API_AVAILABLE(ios(15)); - // Called in |_startDownloadBlock| in DownloadNativeTaskBridge to check if the // block was called. @property(nonatomic, readwrite) BOOL calledStartDownloadBlock;
diff --git a/ios/web/test/fakes/fake_native_task_bridge.mm b/ios/web/test/fakes/fake_native_task_bridge.mm index 053c7e3..295fa2b 100644 --- a/ios/web/test/fakes/fake_native_task_bridge.mm +++ b/ios/web/test/fakes/fake_native_task_bridge.mm
@@ -4,6 +4,9 @@ #import "ios/web/test/fakes/fake_native_task_bridge.h" +#import "base/callback.h" +#import "base/strings/sys_string_conversions.h" + #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif @@ -31,12 +34,12 @@ _progress = [NSProgress progressWithTotalUnitCount:0]; } -- (void)startDownload:(NSURL*)url - progressionHandler:(void (^)())progressionHandler - completionHandler:(web::DownloadCompletionHandler)completionHandler { - [super startDownload:url - progressionHandler:progressionHandler - completionHandler:completionHandler]; +- (void)startDownload:(const base::FilePath&)path + progressCallback:(NativeDownloadTaskProgressCallback)progressCallback + completeCallback:(NativeDownloadTaskCompleteCallback)completeCallback { + [super startDownload:path + progressCallback:std::move(progressCallback) + completeCallback:std::move(completeCallback)]; // Simulates completing a download progress _progress = [NSProgress progressWithTotalUnitCount:100];
diff --git a/ios/web_view/internal/cwv_download_task.mm b/ios/web_view/internal/cwv_download_task.mm index dc28ff9a1..4027a85 100644 --- a/ios/web_view/internal/cwv_download_task.mm +++ b/ios/web_view/internal/cwv_download_task.mm
@@ -101,8 +101,7 @@ } - (void)startDownloadToLocalFileAtPath:(NSString*)path { - _internalTask->Start(base::FilePath(base::SysNSStringToUTF8(path)), - web::DownloadTask::Destination::kToDisk); + _internalTask->Start(base::FilePath(base::SysNSStringToUTF8(path))); } - (void)cancel {
diff --git a/media/renderers/win/media_foundation_source_wrapper.cc b/media/renderers/win/media_foundation_source_wrapper.cc index a6b2cc8..8d5d492 100644 --- a/media/renderers/win/media_foundation_source_wrapper.cc +++ b/media/renderers/win/media_foundation_source_wrapper.cc
@@ -339,6 +339,9 @@ IUnknown** object_out) { DVLOG_FUNC(1); + if (state_ == State::kShutdown) + return MF_E_SHUTDOWN; + if (stream_id >= StreamCount()) return E_INVALIDARG;
diff --git a/media/renderers/win/media_foundation_stream_wrapper.cc b/media/renderers/win/media_foundation_stream_wrapper.cc index 0d77836..3704aa1 100644 --- a/media/renderers/win/media_foundation_stream_wrapper.cc +++ b/media/renderers/win/media_foundation_stream_wrapper.cc
@@ -307,9 +307,9 @@ return; } - if (!demuxer_stream_ || pending_stream_read_) { + if (!demuxer_stream_ || pending_stream_read_) return; - } + demuxer_stream_->Read( base::BindOnce(&MediaFoundationStreamWrapper::OnDemuxerStreamRead, weak_factory_.GetWeakPtr()));
diff --git a/mojo/public/tools/bindings/checks/mojom_attributes_check.py b/mojo/public/tools/bindings/checks/mojom_attributes_check.py index 8be1329..35c450b 100644 --- a/mojo/public/tools/bindings/checks/mojom_attributes_check.py +++ b/mojo/public/tools/bindings/checks/mojom_attributes_check.py
@@ -80,7 +80,6 @@ # TODO(https://crbug.com/1193875) empty this set and remove the allowlist. _STABLE_ONLY_ALLOWLISTED_ENUMS = { - 'ash.health.mojom.DiskReadRoutineTypeEnum', 'ash.ime.mojom.CommitTextCursorBehavior', 'ash.ime.mojom.KeyEventResult', 'ash.ime.mojom.KeyEventType',
diff --git a/net/BUILD.gn b/net/BUILD.gn index 41e5fef..d668e33 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -653,7 +653,6 @@ "http/proxy_client_socket.h", "http/proxy_fallback.cc", "http/proxy_fallback.h", - "http/structured_headers.cc", "http/structured_headers.h", "http/transport_security_persister.cc", "http/transport_security_persister.h", @@ -4206,8 +4205,6 @@ "http/http_vary_data_unittest.cc", "http/mock_allow_http_auth_preferences.cc", "http/mock_allow_http_auth_preferences.h", - "http/structured_headers_generated_unittest.cc", - "http/structured_headers_unittest.cc", "http/test_upload_data_stream_not_allow_http1.cc", "http/test_upload_data_stream_not_allow_http1.h", "http/transport_security_persister_unittest.cc",
diff --git a/net/http/structured_headers.cc b/net/http/structured_headers.cc deleted file mode 100644 index 58953d7..0000000 --- a/net/http/structured_headers.cc +++ /dev/null
@@ -1,984 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/http/structured_headers.h" - -#include <cmath> -#include <string> -#include <utility> - -#include "base/base64.h" -#include "base/containers/flat_set.h" -#include "base/containers/span.h" -#include "base/logging.h" -#include "base/notreached.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" -#include "base/strings/string_util.h" - -namespace net { -namespace structured_headers { - -namespace { - -#define DIGIT "0123456789" -#define LCALPHA "abcdefghijklmnopqrstuvwxyz" -#define UCALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -#define TCHAR DIGIT LCALPHA UCALPHA "!#$%&'*+-.^_`|~" -// https://tools.ietf.org/html/draft-ietf-httpbis-header-structure-09#section-3.9 -constexpr char kTokenChars09[] = DIGIT UCALPHA LCALPHA "_-.:%*/"; -// https://www.rfc-editor.org/rfc/rfc8941.html#section-3.3.4 -constexpr char kTokenChars[] = TCHAR ":/"; -// https://tools.ietf.org/html/draft-ietf-httpbis-header-structure-09#section-3.1 -constexpr char kKeyChars09[] = DIGIT LCALPHA "_-"; -// https://www.rfc-editor.org/rfc/rfc8941.html#section-3.1.2 -constexpr char kKeyChars[] = DIGIT LCALPHA "_-.*"; -constexpr char kSP[] = " "; -constexpr char kOWS[] = " \t"; -#undef DIGIT -#undef LCALPHA -#undef UCALPHA - -// https://www.rfc-editor.org/rfc/rfc8941.html#section-3.3.1 -constexpr int64_t kMaxInteger = 999'999'999'999'999L; -constexpr int64_t kMinInteger = -999'999'999'999'999L; - -// Smallest value which is too large for an sh-decimal. This is the smallest -// double which will round up to 1e12 when serialized, which exceeds the range -// for sh-decimal. Any float less than this should round down. This behaviour is -// verified by unit tests. -constexpr double kTooLargeDecimal = 1e12 - 0.0005; - -// Parser for (a subset of) Structured Headers for HTTP defined in [SH09] and -// [RFC8941]. [SH09] compatibility is retained for use by Web Packaging, and can -// be removed once that spec is updated, and users have migrated to new headers. -// [SH09] https://tools.ietf.org/html/draft-ietf-httpbis-header-structure-09 -// [RFC8941] https://www.rfc-editor.org/rfc/rfc8941.html -class StructuredHeaderParser { - public: - enum DraftVersion { - kDraft09, - kFinal, - }; - explicit StructuredHeaderParser(base::StringPiece str, DraftVersion version) - : input_(str), version_(version) { - // [SH09] 4.2 Step 1. - // Discard any leading OWS from input_string. - // [RFC8941] 4.2 Step 2. - // Discard any leading SP characters from input_string. - SkipWhitespaces(); - } - StructuredHeaderParser(const StructuredHeaderParser&) = delete; - StructuredHeaderParser& operator=(const StructuredHeaderParser&) = delete; - - // Callers should call this after ReadSomething(), to check if parser has - // consumed all the input successfully. - bool FinishParsing() { - // [SH09] 4.2 Step 7. - // Discard any leading OWS from input_string. - // [RFC8941] 4.2 Step 6. - // Discard any leading SP characters from input_string. - SkipWhitespaces(); - // [SH09] 4.2 Step 8. [RFC8941] 4.2 Step 7. - // If input_string is not empty, fail parsing. - return input_.empty(); - } - - // Parses a List of Lists ([SH09] 4.2.4). - absl::optional<ListOfLists> ReadListOfLists() { - DCHECK_EQ(version_, kDraft09); - ListOfLists result; - while (true) { - std::vector<Item> inner_list; - while (true) { - absl::optional<Item> item(ReadBareItem()); - if (!item) - return absl::nullopt; - inner_list.push_back(std::move(*item)); - SkipWhitespaces(); - if (!ConsumeChar(';')) - break; - SkipWhitespaces(); - } - result.push_back(std::move(inner_list)); - SkipWhitespaces(); - if (!ConsumeChar(',')) - break; - SkipWhitespaces(); - } - return result; - } - - // Parses a List ([RFC8941] 4.2.1). - absl::optional<List> ReadList() { - DCHECK_EQ(version_, kFinal); - List members; - while (!input_.empty()) { - absl::optional<ParameterizedMember> member(ReadItemOrInnerList()); - if (!member) - return absl::nullopt; - members.push_back(std::move(*member)); - SkipOWS(); - if (input_.empty()) - break; - if (!ConsumeChar(',')) - return absl::nullopt; - SkipOWS(); - if (input_.empty()) - return absl::nullopt; - } - return members; - } - - // Parses an Item ([RFC8941] 4.2.3). - absl::optional<ParameterizedItem> ReadItem() { - absl::optional<Item> item = ReadBareItem(); - if (!item) - return absl::nullopt; - absl::optional<Parameters> parameters = ReadParameters(); - if (!parameters) - return absl::nullopt; - return ParameterizedItem(std::move(*item), std::move(*parameters)); - } - - // Parses a bare Item ([RFC8941] 4.2.3.1, though this is also the algorithm - // for parsing an Item from [SH09] 4.2.7). - absl::optional<Item> ReadBareItem() { - if (input_.empty()) { - DVLOG(1) << "ReadBareItem: unexpected EOF"; - return absl::nullopt; - } - switch (input_.front()) { - case '"': - return ReadString(); - case '*': - if (version_ == kDraft09) - return ReadByteSequence(); - return ReadToken(); - case ':': - if (version_ == kFinal) - return ReadByteSequence(); - return absl::nullopt; - case '?': - return ReadBoolean(); - default: - if (input_.front() == '-' || base::IsAsciiDigit(input_.front())) - return ReadNumber(); - if (base::IsAsciiAlpha(input_.front())) - return ReadToken(); - return absl::nullopt; - } - } - - // Parses a Dictionary ([RFC8941] 4.2.2). - absl::optional<Dictionary> ReadDictionary() { - DCHECK_EQ(version_, kFinal); - Dictionary members; - while (!input_.empty()) { - absl::optional<std::string> key(ReadKey()); - if (!key) - return absl::nullopt; - absl::optional<ParameterizedMember> member; - if (ConsumeChar('=')) { - member = ReadItemOrInnerList(); - if (!member) - return absl::nullopt; - } else { - absl::optional<Parameters> parameters; - parameters = ReadParameters(); - if (!parameters) - return absl::nullopt; - member = ParameterizedMember{Item(true), std::move(*parameters)}; - } - members[*key] = std::move(*member); - SkipOWS(); - if (input_.empty()) - break; - if (!ConsumeChar(',')) - return absl::nullopt; - SkipOWS(); - if (input_.empty()) - return absl::nullopt; - } - return members; - } - - // Parses a Parameterised List ([SH09] 4.2.5). - absl::optional<ParameterisedList> ReadParameterisedList() { - DCHECK_EQ(version_, kDraft09); - ParameterisedList items; - while (true) { - absl::optional<ParameterisedIdentifier> item = - ReadParameterisedIdentifier(); - if (!item) - return absl::nullopt; - items.push_back(std::move(*item)); - SkipWhitespaces(); - if (!ConsumeChar(',')) - return items; - SkipWhitespaces(); - } - } - - private: - // Parses a Parameterised Identifier ([SH09] 4.2.6). - absl::optional<ParameterisedIdentifier> ReadParameterisedIdentifier() { - DCHECK_EQ(version_, kDraft09); - absl::optional<Item> primary_identifier = ReadToken(); - if (!primary_identifier) - return absl::nullopt; - - ParameterisedIdentifier::Parameters parameters; - - SkipWhitespaces(); - while (ConsumeChar(';')) { - SkipWhitespaces(); - - absl::optional<std::string> name = ReadKey(); - if (!name) - return absl::nullopt; - - Item value; - if (ConsumeChar('=')) { - auto item = ReadBareItem(); - if (!item) - return absl::nullopt; - value = std::move(*item); - } - if (!parameters.emplace(*name, value).second) { - DVLOG(1) << "ReadParameterisedIdentifier: duplicated parameter: " - << *name; - return absl::nullopt; - } - SkipWhitespaces(); - } - return ParameterisedIdentifier(std::move(*primary_identifier), - std::move(parameters)); - } - - // Parses an Item or Inner List ([RFC8941] 4.2.1.1). - absl::optional<ParameterizedMember> ReadItemOrInnerList() { - DCHECK_EQ(version_, kFinal); - std::vector<Item> member; - bool member_is_inner_list = (!input_.empty() && input_.front() == '('); - if (member_is_inner_list) { - return ReadInnerList(); - } else { - auto item = ReadItem(); - if (!item) - return absl::nullopt; - return ParameterizedMember(std::move(item->item), - std::move(item->params)); - } - } - - // Parses Parameters ([RFC8941] 4.2.3.2) - absl::optional<Parameters> ReadParameters() { - Parameters parameters; - base::flat_set<std::string> keys; - - while (ConsumeChar(';')) { - SkipWhitespaces(); - - absl::optional<std::string> name = ReadKey(); - if (!name) - return absl::nullopt; - bool is_duplicate_key = !keys.insert(*name).second; - - Item value{true}; - if (ConsumeChar('=')) { - auto item = ReadBareItem(); - if (!item) - return absl::nullopt; - value = std::move(*item); - } - if (is_duplicate_key) { - for (auto& param : parameters) { - if (param.first == name) { - param.second = std::move(value); - break; - } - } - } else { - parameters.emplace_back(std::move(*name), std::move(value)); - } - } - return parameters; - } - - // Parses an Inner List ([RFC8941] 4.2.1.2). - absl::optional<ParameterizedMember> ReadInnerList() { - DCHECK_EQ(version_, kFinal); - if (!ConsumeChar('(')) - return absl::nullopt; - std::vector<ParameterizedItem> inner_list; - while (true) { - SkipWhitespaces(); - if (ConsumeChar(')')) { - absl::optional<Parameters> parameters; - parameters = ReadParameters(); - if (!parameters) - return absl::nullopt; - return ParameterizedMember(std::move(inner_list), true, - std::move(*parameters)); - } - auto item = ReadItem(); - if (!item) - return absl::nullopt; - inner_list.push_back(std::move(*item)); - if (input_.empty() || (input_.front() != ' ' && input_.front() != ')')) - return absl::nullopt; - } - NOTREACHED(); - return absl::nullopt; - } - - // Parses a Key ([SH09] 4.2.2, [RFC8941] 4.2.3.3). - absl::optional<std::string> ReadKey() { - if (version_ == kDraft09) { - if (input_.empty() || !base::IsAsciiLower(input_.front())) { - LogParseError("ReadKey", "lcalpha"); - return absl::nullopt; - } - } else { - if (input_.empty() || - (!base::IsAsciiLower(input_.front()) && input_.front() != '*')) { - LogParseError("ReadKey", "lcalpha | *"); - return absl::nullopt; - } - } - const char* allowed_chars = - (version_ == kDraft09 ? kKeyChars09 : kKeyChars); - size_t len = input_.find_first_not_of(allowed_chars); - if (len == base::StringPiece::npos) - len = input_.size(); - std::string key(input_.substr(0, len)); - input_.remove_prefix(len); - return key; - } - - // Parses a Token ([SH09] 4.2.10, [RFC8941] 4.2.6). - absl::optional<Item> ReadToken() { - if (input_.empty() || - !(base::IsAsciiAlpha(input_.front()) || input_.front() == '*')) { - LogParseError("ReadToken", "ALPHA"); - return absl::nullopt; - } - size_t len = input_.find_first_not_of(version_ == kDraft09 ? kTokenChars09 - : kTokenChars); - if (len == base::StringPiece::npos) - len = input_.size(); - std::string token(input_.substr(0, len)); - input_.remove_prefix(len); - return Item(std::move(token), Item::kTokenType); - } - - // Parses a Number ([SH09] 4.2.8, [RFC8941] 4.2.4). - absl::optional<Item> ReadNumber() { - bool is_negative = ConsumeChar('-'); - bool is_decimal = false; - size_t decimal_position = 0; - size_t i = 0; - for (; i < input_.size(); ++i) { - if (i > 0 && input_[i] == '.' && !is_decimal) { - is_decimal = true; - decimal_position = i; - continue; - } - if (!base::IsAsciiDigit(input_[i])) - break; - } - if (i == 0) { - LogParseError("ReadNumber", "DIGIT"); - return absl::nullopt; - } - if (!is_decimal) { - // [RFC8941] restricts the range of integers further. - if (version_ == kFinal && i > 15) { - LogParseError("ReadNumber", "integer too long"); - return absl::nullopt; - } - } else { - if (version_ != kFinal && i > 16) { - LogParseError("ReadNumber", "float too long"); - return absl::nullopt; - } - if (version_ == kFinal && decimal_position > 12) { - LogParseError("ReadNumber", "decimal too long"); - return absl::nullopt; - } - if (i - decimal_position > (version_ == kFinal ? 4 : 7)) { - LogParseError("ReadNumber", "too many digits after decimal"); - return absl::nullopt; - } - if (i == decimal_position) { - LogParseError("ReadNumber", "no digits after decimal"); - return absl::nullopt; - } - } - std::string output_number_string(input_.substr(0, i)); - input_.remove_prefix(i); - - if (is_decimal) { - // Convert to a 64-bit double, and return if the conversion is - // successful. - double f; - if (!base::StringToDouble(output_number_string, &f)) - return absl::nullopt; - return Item(is_negative ? -f : f); - } else { - // Convert to a 64-bit signed integer, and return if the conversion is - // successful. - int64_t n; - if (!base::StringToInt64(output_number_string, &n)) - return absl::nullopt; - DCHECK(version_ != kFinal || (n <= kMaxInteger && n >= kMinInteger)); - return Item(is_negative ? -n : n); - } - } - - // Parses a String ([SH09] 4.2.9, [RFC8941] 4.2.5). - absl::optional<Item> ReadString() { - std::string s; - if (!ConsumeChar('"')) { - LogParseError("ReadString", "'\"'"); - return absl::nullopt; - } - while (!ConsumeChar('"')) { - size_t i = 0; - for (; i < input_.size(); ++i) { - if (!base::IsAsciiPrintable(input_[i])) { - DVLOG(1) << "ReadString: non printable-ASCII character"; - return absl::nullopt; - } - if (input_[i] == '"' || input_[i] == '\\') - break; - } - if (i == input_.size()) { - DVLOG(1) << "ReadString: missing closing '\"'"; - return absl::nullopt; - } - s.append(std::string(input_.substr(0, i))); - input_.remove_prefix(i); - if (ConsumeChar('\\')) { - if (input_.empty()) { - DVLOG(1) << "ReadString: backslash at string end"; - return absl::nullopt; - } - if (input_[0] != '"' && input_[0] != '\\') { - DVLOG(1) << "ReadString: invalid escape"; - return absl::nullopt; - } - s.push_back(input_.front()); - input_.remove_prefix(1); - } - } - return s; - } - - // Parses a Byte Sequence ([SH09] 4.2.11, [RFC8941] 4.2.7). - absl::optional<Item> ReadByteSequence() { - char delimiter = (version_ == kDraft09 ? '*' : ':'); - if (!ConsumeChar(delimiter)) { - LogParseError("ReadByteSequence", "delimiter"); - return absl::nullopt; - } - size_t len = input_.find(delimiter); - if (len == base::StringPiece::npos) { - DVLOG(1) << "ReadByteSequence: missing closing delimiter"; - return absl::nullopt; - } - std::string base64(input_.substr(0, len)); - // Append the necessary padding characters. - base64.resize((base64.size() + 3) / 4 * 4, '='); - - std::string binary; - if (!base::Base64Decode(base64, &binary)) { - DVLOG(1) << "ReadByteSequence: failed to decode base64: " << base64; - return absl::nullopt; - } - input_.remove_prefix(len); - ConsumeChar(delimiter); - return Item(std::move(binary), Item::kByteSequenceType); - } - - // Parses a Boolean ([RFC8941] 4.2.8). - // Note that this only parses ?0 and ?1 forms from SH version 10+, not the - // previous ?F and ?T, which were not needed by any consumers of SH version 9. - absl::optional<Item> ReadBoolean() { - if (!ConsumeChar('?')) { - LogParseError("ReadBoolean", "'?'"); - return absl::nullopt; - } - if (ConsumeChar('1')) { - return Item(true); - } - if (ConsumeChar('0')) { - return Item(false); - } - return absl::nullopt; - } - - // There are several points in the specs where the handling of whitespace - // differs between Draft 9 and the final RFC. In those cases, Draft 9 allows - // any OWS character, while the RFC allows only a U+0020 SPACE. - void SkipWhitespaces() { - if (version_ == kDraft09) { - input_ = - base::TrimString(input_, base::StringPiece(kOWS), base::TRIM_LEADING); - } else { - input_ = - base::TrimString(input_, base::StringPiece(kSP), base::TRIM_LEADING); - } - } - - void SkipOWS() { - input_ = - base::TrimString(input_, base::StringPiece(kOWS), base::TRIM_LEADING); - } - - bool ConsumeChar(char expected) { - if (!input_.empty() && input_.front() == expected) { - input_.remove_prefix(1); - return true; - } - return false; - } - - void LogParseError(const char* func, const char* expected) { - DVLOG(1) << func << ": " << expected << " expected, got " - << (input_.empty() ? "EOS" - : "'" + std::string(input_.substr(0, 1)) + "'"); - } - - base::StringPiece input_; - DraftVersion version_; -}; - -// Serializer for (a subset of) Structured Field Values for HTTP defined in -// [RFC8941]. Note that this serializer does not attempt to support [SH09]. -class StructuredHeaderSerializer { - public: - StructuredHeaderSerializer() = default; - ~StructuredHeaderSerializer() = default; - StructuredHeaderSerializer(const StructuredHeaderSerializer&) = delete; - StructuredHeaderSerializer& operator=(const StructuredHeaderSerializer&) = - delete; - - std::string Output() { return output_.str(); } - - // Serializes a List ([RFC8941] 4.1.1). - bool WriteList(const List& value) { - bool first = true; - for (const auto& member : value) { - if (!first) - output_ << ", "; - if (!WriteParameterizedMember(member)) - return false; - first = false; - } - return true; - } - - // Serializes an Item ([RFC8941] 4.1.3). - bool WriteItem(const ParameterizedItem& value) { - if (!WriteBareItem(value.item)) - return false; - return WriteParameters(value.params); - } - - // Serializes an Item ([RFC8941] 4.1.3). - bool WriteBareItem(const Item& value) { - if (value.is_string()) { - // Serializes a String ([RFC8941] 4.1.6). - output_ << "\""; - for (const char& c : value.GetString()) { - if (!base::IsAsciiPrintable(c)) - return false; - if (c == '\\' || c == '\"') - output_ << "\\"; - output_ << c; - } - output_ << "\""; - return true; - } - if (value.is_token()) { - // Serializes a Token ([RFC8941] 4.1.7). - if (!value.GetString().size() || - !(base::IsAsciiAlpha(value.GetString().front()) || - value.GetString().front() == '*')) - return false; - if (value.GetString().find_first_not_of(kTokenChars) != std::string::npos) - return false; - output_ << value.GetString(); - return true; - } - if (value.is_byte_sequence()) { - // Serializes a Byte Sequence ([RFC8941] 4.1.8). - output_ << ":"; - output_ << base::Base64Encode( - base::as_bytes(base::make_span(value.GetString()))); - output_ << ":"; - return true; - } - if (value.is_integer()) { - // Serializes an Integer ([RFC8941] 4.1.4). - if (value.GetInteger() > kMaxInteger || value.GetInteger() < kMinInteger) - return false; - output_ << value.GetInteger(); - return true; - } - if (value.is_decimal()) { - // Serializes a Decimal ([RFC8941] 4.1.5). - double decimal_value = value.GetDecimal(); - if (!std::isfinite(decimal_value) || - fabs(decimal_value) >= kTooLargeDecimal) - return false; - - // Handle sign separately to simplify the rest of the formatting. - if (decimal_value < 0) - output_ << "-"; - // Unconditionally take absolute value to ensure that -0 is serialized as - // "0.0", with no negative sign, as required by spec. (4.1.5, step 2). - decimal_value = fabs(decimal_value); - double remainder = fmod(decimal_value, 0.002); - if (remainder == 0.0005) { - // Value ended in exactly 0.0005, 0.0025, 0.0045, etc. Round down. - decimal_value -= 0.0005; - } else if (remainder == 0.0015) { - // Value ended in exactly 0.0015, 0.0035, 0,0055, etc. Round up. - decimal_value += 0.0005; - } else { - // Standard rounding will work in all other cases. - decimal_value = round(decimal_value * 1000.0) / 1000.0; - } - - // Use standard library functions to write the decimal, and then truncate - // if necessary to conform to spec. - - // Maximum is 12 integer digits, one decimal point, three fractional - // digits, and a null terminator. - char buffer[17]; - base::snprintf(buffer, std::size(buffer), "%#.3f", decimal_value); - - // Strip any trailing 0s after the decimal point, but leave at least one - // digit after it in all cases. (So 1.230 becomes 1.23, but 1.000 becomes - // 1.0.) - base::StringPiece formatted_number(buffer); - auto truncate_index = formatted_number.find_last_not_of('0'); - if (formatted_number[truncate_index] == '.') - truncate_index++; - output_ << formatted_number.substr(0, truncate_index + 1); - return true; - } - if (value.is_boolean()) { - // Serializes a Boolean ([RFC8941] 4.1.9). - output_ << (value.GetBoolean() ? "?1" : "?0"); - return true; - } - return false; - } - - // Serializes a Dictionary ([RFC8941] 4.1.2). - bool WriteDictionary(const Dictionary& value) { - bool first = true; - for (const auto& dict : value) { - const auto& dict_member = dict.second; - if (!first) - output_ << ", "; - if (!WriteKey(dict.first)) - return false; - first = false; - if (!dict_member.member_is_inner_list && - dict_member.member.front().item.is_boolean() && - dict_member.member.front().item.GetBoolean()) { - if (!WriteParameters(dict_member.params)) - return false; - } else { - output_ << "="; - if (!WriteParameterizedMember(dict_member)) - return false; - } - } - return true; - } - - private: - bool WriteParameterizedMember(const ParameterizedMember& value) { - // Serializes a parameterized member ([RFC8941] 4.1.1). - if (value.member_is_inner_list) { - if (!WriteInnerList(value.member)) - return false; - } else { - DCHECK_EQ(value.member.size(), 1UL); - if (!WriteItem(value.member[0])) - return false; - } - return WriteParameters(value.params); - } - - bool WriteInnerList(const std::vector<ParameterizedItem>& value) { - // Serializes an inner list ([RFC8941] 4.1.1.1). - output_ << "("; - bool first = true; - for (const ParameterizedItem& member : value) { - if (!first) - output_ << " "; - if (!WriteItem(member)) - return false; - first = false; - } - output_ << ")"; - return true; - } - - bool WriteParameters(const Parameters& value) { - // Serializes a parameter list ([RFC8941] 4.1.1.2). - for (const auto& param_name_and_value : value) { - const std::string& param_name = param_name_and_value.first; - const Item& param_value = param_name_and_value.second; - output_ << ";"; - if (!WriteKey(param_name)) - return false; - if (!param_value.is_null()) { - if (param_value.is_boolean() && param_value.GetBoolean()) - continue; - output_ << "="; - if (!WriteBareItem(param_value)) - return false; - } - } - return true; - } - - bool WriteKey(const std::string& value) { - // Serializes a Key ([RFC8941] 4.1.1.3). - if (!value.size()) - return false; - if (value.find_first_not_of(kKeyChars) != std::string::npos) - return false; - if (!base::IsAsciiLower(value[0]) && value[0] != '*') - return false; - output_ << value; - return true; - } - - std::ostringstream output_; -}; - -} // namespace - -Item::Item() {} -Item::Item(const std::string& value, Item::ItemType type) - : type_(type), string_value_(value) {} -Item::Item(std::string&& value, Item::ItemType type) - : type_(type), string_value_(std::move(value)) { - DCHECK(type_ == kStringType || type_ == kTokenType || - type_ == kByteSequenceType); -} -Item::Item(const char* value, Item::ItemType type) - : Item(std::string(value), type) {} -Item::Item(int64_t value) : type_(kIntegerType), integer_value_(value) {} -Item::Item(double value) : type_(kDecimalType), decimal_value_(value) {} -Item::Item(bool value) : type_(kBooleanType), boolean_value_(value) {} - -bool operator==(const Item& lhs, const Item& rhs) { - if (lhs.type_ != rhs.type_) - return false; - switch (lhs.type_) { - case Item::kNullType: - return true; - case Item::kStringType: - case Item::kTokenType: - case Item::kByteSequenceType: - return lhs.string_value_ == rhs.string_value_; - case Item::kIntegerType: - return lhs.integer_value_ == rhs.integer_value_; - case Item::kDecimalType: - return lhs.decimal_value_ == rhs.decimal_value_; - case Item::kBooleanType: - return lhs.boolean_value_ == rhs.boolean_value_; - } - NOTREACHED(); - return false; -} - -ParameterizedItem::ParameterizedItem(const ParameterizedItem&) = default; -ParameterizedItem& ParameterizedItem::operator=(const ParameterizedItem&) = - default; -ParameterizedItem::ParameterizedItem(Item id, const Parameters& ps) - : item(std::move(id)), params(ps) {} -ParameterizedItem::~ParameterizedItem() = default; - -ParameterizedMember::ParameterizedMember() = default; -ParameterizedMember::ParameterizedMember(const ParameterizedMember&) = default; -ParameterizedMember& ParameterizedMember::operator=( - const ParameterizedMember&) = default; -ParameterizedMember::ParameterizedMember(std::vector<ParameterizedItem> id, - bool member_is_inner_list, - const Parameters& ps) - : member(std::move(id)), - member_is_inner_list(member_is_inner_list), - params(ps) {} -ParameterizedMember::ParameterizedMember(std::vector<ParameterizedItem> id, - const Parameters& ps) - : member(std::move(id)), member_is_inner_list(true), params(ps) {} -ParameterizedMember::ParameterizedMember(Item id, const Parameters& ps) - : member({{std::move(id), {}}}), member_is_inner_list(false), params(ps) {} -ParameterizedMember::~ParameterizedMember() = default; - -ParameterisedIdentifier::ParameterisedIdentifier( - const ParameterisedIdentifier&) = default; -ParameterisedIdentifier& ParameterisedIdentifier::operator=( - const ParameterisedIdentifier&) = default; -ParameterisedIdentifier::ParameterisedIdentifier(Item id, const Parameters& ps) - : identifier(std::move(id)), params(ps) {} -ParameterisedIdentifier::~ParameterisedIdentifier() = default; - -Dictionary::Dictionary() = default; -Dictionary::Dictionary(const Dictionary&) = default; -Dictionary::Dictionary(std::vector<DictionaryMember> members) - : members_(std::move(members)) {} -Dictionary::~Dictionary() = default; -std::vector<DictionaryMember>::iterator Dictionary::begin() { - return members_.begin(); -} -std::vector<DictionaryMember>::const_iterator Dictionary::begin() const { - return members_.begin(); -} -std::vector<DictionaryMember>::iterator Dictionary::end() { - return members_.end(); -} -std::vector<DictionaryMember>::const_iterator Dictionary::end() const { - return members_.end(); -} -ParameterizedMember& Dictionary::operator[](std::size_t idx) { - return members_[idx].second; -} -const ParameterizedMember& Dictionary::operator[](std::size_t idx) const { - return members_[idx].second; -} -ParameterizedMember& Dictionary::at(std::size_t idx) { - return (*this)[idx]; -} -const ParameterizedMember& Dictionary::at(std::size_t idx) const { - return (*this)[idx]; -} -ParameterizedMember& Dictionary::operator[](base::StringPiece key) { - auto it = - std::find_if(members_.begin(), members_.end(), - [key](const auto& member) { return member.first == key; }); - if (it != members_.end()) - return it->second; - return (*(members_.insert(members_.end(), make_pair(std::string(key), - ParameterizedMember())))) - .second; -} -ParameterizedMember& Dictionary::at(base::StringPiece key) { - auto it = - std::find_if(members_.begin(), members_.end(), - [key](const auto& member) { return member.first == key; }); - DCHECK(it != members_.end()) << "Provided key not found in dictionary"; - return it->second; -} -const ParameterizedMember& Dictionary::at(base::StringPiece key) const { - auto it = - std::find_if(members_.begin(), members_.end(), - [key](const auto& member) { return member.first == key; }); - DCHECK(it != members_.end()) << "Provided key not found in dictionary"; - return it->second; -} -bool Dictionary::empty() const { - return members_.empty(); -} -std::size_t Dictionary::size() const { - return members_.size(); -} -bool Dictionary::contains(base::StringPiece key) const { - for (auto& member : members_) { - if (member.first == key) - return true; - } - return false; -} - -absl::optional<ParameterizedItem> ParseItem(base::StringPiece str) { - StructuredHeaderParser parser(str, StructuredHeaderParser::kFinal); - absl::optional<ParameterizedItem> item = parser.ReadItem(); - if (item && parser.FinishParsing()) - return item; - return absl::nullopt; -} - -absl::optional<Item> ParseBareItem(base::StringPiece str) { - StructuredHeaderParser parser(str, StructuredHeaderParser::kFinal); - absl::optional<Item> item = parser.ReadBareItem(); - if (item && parser.FinishParsing()) - return item; - return absl::nullopt; -} - -absl::optional<ParameterisedList> ParseParameterisedList( - base::StringPiece str) { - StructuredHeaderParser parser(str, StructuredHeaderParser::kDraft09); - absl::optional<ParameterisedList> param_list = parser.ReadParameterisedList(); - if (param_list && parser.FinishParsing()) - return param_list; - return absl::nullopt; -} - -absl::optional<ListOfLists> ParseListOfLists(base::StringPiece str) { - StructuredHeaderParser parser(str, StructuredHeaderParser::kDraft09); - absl::optional<ListOfLists> list_of_lists = parser.ReadListOfLists(); - if (list_of_lists && parser.FinishParsing()) - return list_of_lists; - return absl::nullopt; -} - -absl::optional<List> ParseList(base::StringPiece str) { - StructuredHeaderParser parser(str, StructuredHeaderParser::kFinal); - absl::optional<List> list = parser.ReadList(); - if (list && parser.FinishParsing()) - return list; - return absl::nullopt; -} - -absl::optional<Dictionary> ParseDictionary(const base::StringPiece& str) { - StructuredHeaderParser parser(str, StructuredHeaderParser::kFinal); - absl::optional<Dictionary> dictionary = parser.ReadDictionary(); - if (dictionary && parser.FinishParsing()) - return dictionary; - return absl::nullopt; -} - -absl::optional<std::string> SerializeItem(const Item& value) { - StructuredHeaderSerializer s; - if (s.WriteItem(ParameterizedItem(value, {}))) - return s.Output(); - return absl::nullopt; -} - -absl::optional<std::string> SerializeItem(const ParameterizedItem& value) { - StructuredHeaderSerializer s; - if (s.WriteItem(value)) - return s.Output(); - return absl::nullopt; -} - -absl::optional<std::string> SerializeList(const List& value) { - StructuredHeaderSerializer s; - if (s.WriteList(value)) - return s.Output(); - return absl::nullopt; -} - -absl::optional<std::string> SerializeDictionary(const Dictionary& value) { - StructuredHeaderSerializer s; - if (s.WriteDictionary(value)) - return s.Output(); - return absl::nullopt; -} - -} // namespace structured_headers -} // namespace net
diff --git a/net/http/structured_headers.h b/net/http/structured_headers.h index c8930fa2..97a1da5 100644 --- a/net/http/structured_headers.h +++ b/net/http/structured_headers.h
@@ -5,298 +5,70 @@ #ifndef NET_HTTP_STRUCTURED_HEADERS_H_ #define NET_HTTP_STRUCTURED_HEADERS_H_ -#include <algorithm> -#include <map> #include <string> -#include <tuple> -#include <vector> -#include "base/check.h" +#include "base/strings/abseil_string_conversions.h" #include "base/strings/string_piece.h" -#include "net/base/net_export.h" +#include "net/third_party/quiche/src/quiche/common/structured_headers.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace net { namespace structured_headers { -// This file implements parsing of HTTP structured headers, as defined in -// RFC8941 (https://www.rfc-editor.org/rfc/rfc8941.html). For compatibility with -// the shipped implementation of Web Packaging, this file also supports a -// previous revision of the standard, referred to here as "Draft 9". -// (https://datatracker.ietf.org/doc/draft-ietf-httpbis-header-structure/09/) -// -// The major difference between the two revisions is in the various list -// formats: Draft 9 describes "parameterised lists" and "lists-of-lists", while -// the final RFC uses a single "list" syntax, whose members may be inner lists. -// There should be no ambiguity, however, as the code which calls this parser -// should be expecting only a single type for a given header. -// -// References within the code are tagged with either [SH09] or [RFC8941], -// depending on which revision they refer to. -// -// Currently supported data types are: -// Item: -// integer: 123 -// string: "abc" -// token: abc -// byte sequence: *YWJj* -// Parameterised list: abc_123;a=1;b=2; cdef_456, ghi;q="9";r="w" -// List-of-lists: "foo";"bar", "baz", "bat"; "one" -// List: "foo", "bar", "It was the best of times." -// ("foo" "bar"), ("baz"), ("bat" "one"), () -// abc;a=1;b=2; cde_456, (ghi jkl);q="9";r=w -// Dictionary: a=(1 2), b=3, c=4;aa=bb, d=(5 6);valid=?0 -// -// Functions are provided to parse each of these, which are intended to be -// called with the complete value of an HTTP header (that is, any -// sub-structure will be handled internally by the parser; the exported -// functions are not intended to be called on partial header strings.) Input -// values should be ASCII byte strings (non-ASCII characters should not be -// present in Structured Header values, and will cause the entire header to fail -// to parse.) +using Item = quiche::structured_headers::Item; +using ParameterisedIdentifier = + quiche::structured_headers::ParameterisedIdentifier; +using ParameterizedItem = quiche::structured_headers::ParameterizedItem; +using ParameterizedMember = quiche::structured_headers::ParameterizedMember; +using DictionaryMember = quiche::structured_headers::DictionaryMember; +using Dictionary = quiche::structured_headers::Dictionary; +using ParameterisedList = quiche::structured_headers::ParameterisedList; +using ListOfLists = quiche::structured_headers::ListOfLists; +using List = quiche::structured_headers::List; +using Parameters = quiche::structured_headers::Parameters; -class NET_EXPORT Item { - public: - enum ItemType { - kNullType, - kIntegerType, - kDecimalType, - kStringType, - kTokenType, - kByteSequenceType, - kBooleanType - }; - Item(); - explicit Item(int64_t value); - explicit Item(double value); - explicit Item(bool value); - - // Constructors for string-like items: Strings, Tokens and Byte Sequences. - Item(const char* value, Item::ItemType type = kStringType); - // Item(StringPiece value, Item::ItemType type = kStringType); - Item(const std::string& value, Item::ItemType type = kStringType); - Item(std::string&& value, Item::ItemType type = kStringType); - - NET_EXPORT friend bool operator==(const Item& lhs, const Item& rhs); - inline friend bool operator!=(const Item& lhs, const Item& rhs) { - return !(lhs == rhs); - } - - bool is_null() const { return type_ == kNullType; } - bool is_integer() const { return type_ == kIntegerType; } - bool is_decimal() const { return type_ == kDecimalType; } - bool is_string() const { return type_ == kStringType; } - bool is_token() const { return type_ == kTokenType; } - bool is_byte_sequence() const { return type_ == kByteSequenceType; } - bool is_boolean() const { return type_ == kBooleanType; } - - int64_t GetInteger() const { - DCHECK_EQ(type_, kIntegerType); - return integer_value_; - } - double GetDecimal() const { - DCHECK_EQ(type_, kDecimalType); - return decimal_value_; - } - bool GetBoolean() const { - DCHECK_EQ(type_, kBooleanType); - return boolean_value_; - } - // TODO(iclelland): Split up accessors for String, Token and Byte Sequence. - const std::string& GetString() const { - DCHECK(type_ == kStringType || type_ == kTokenType || - type_ == kByteSequenceType); - return string_value_; - } - - ItemType Type() const { return type_; } - - private: - ItemType type_ = kNullType; - // TODO(iclelland): Make this class more memory-efficient, replacing the - // values here with a union or std::variant (when available). - int64_t integer_value_ = 0; - std::string string_value_; - double decimal_value_; - bool boolean_value_; -}; - -// Holds a ParameterizedIdentifier (draft 9 only). The contained Item must be a -// Token, and there may be any number of parameters. Parameter ordering is not -// significant. -struct NET_EXPORT ParameterisedIdentifier { - using Parameters = std::map<std::string, Item>; - - Item identifier; - Parameters params; - - ParameterisedIdentifier(const ParameterisedIdentifier&); - ParameterisedIdentifier& operator=(const ParameterisedIdentifier&); - ParameterisedIdentifier(Item, const Parameters&); - ~ParameterisedIdentifier(); -}; - -inline bool operator==(const ParameterisedIdentifier& lhs, - const ParameterisedIdentifier& rhs) { - return std::tie(lhs.identifier, lhs.params) == - std::tie(rhs.identifier, rhs.params); +inline absl::optional<ParameterizedItem> ParseItem(base::StringPiece str) { + return quiche::structured_headers::ParseItem( + base::StringPieceToStringView(str)); +} +inline absl::optional<Item> ParseBareItem(base::StringPiece str) { + return quiche::structured_headers::ParseBareItem( + base::StringPieceToStringView(str)); +} +inline absl::optional<ParameterisedList> ParseParameterisedList( + base::StringPiece str) { + return quiche::structured_headers::ParseParameterisedList( + base::StringPieceToStringView(str)); +} +inline absl::optional<ListOfLists> ParseListOfLists(base::StringPiece str) { + return quiche::structured_headers::ParseListOfLists( + base::StringPieceToStringView(str)); +} +inline absl::optional<List> ParseList(base::StringPiece str) { + return quiche::structured_headers::ParseList( + base::StringPieceToStringView(str)); +} +inline absl::optional<Dictionary> ParseDictionary( + const base::StringPiece& str) { + return quiche::structured_headers::ParseDictionary( + base::StringPieceToStringView(str)); } -using Parameters = std::vector<std::pair<std::string, Item>>; - -struct NET_EXPORT ParameterizedItem { - Item item; - Parameters params; - - ParameterizedItem(const ParameterizedItem&); - ParameterizedItem& operator=(const ParameterizedItem&); - ParameterizedItem(Item, const Parameters&); - ~ParameterizedItem(); -}; - -inline bool operator==(const ParameterizedItem& lhs, - const ParameterizedItem& rhs) { - return std::tie(lhs.item, lhs.params) == std::tie(rhs.item, rhs.params); +inline absl::optional<std::string> SerializeItem(const Item& value) { + return quiche::structured_headers::SerializeItem(value); } - -inline bool operator!=(const ParameterizedItem& lhs, - const ParameterizedItem& rhs) { - return !(lhs == rhs); +inline absl::optional<std::string> SerializeItem( + const ParameterizedItem& value) { + return quiche::structured_headers::SerializeItem(value); } - -// Holds a ParameterizedMember, which may be either an single Item, or an Inner -// List of ParameterizedItems, along with any number of parameters. Parameter -// ordering is significant. -struct NET_EXPORT ParameterizedMember { - std::vector<ParameterizedItem> member; - // If false, then |member| should only hold one Item. - bool member_is_inner_list = false; - - Parameters params; - - ParameterizedMember(); - ParameterizedMember(const ParameterizedMember&); - ParameterizedMember& operator=(const ParameterizedMember&); - ParameterizedMember(std::vector<ParameterizedItem>, - bool member_is_inner_list, - const Parameters&); - // Shorthand constructor for a member which is an inner list. - ParameterizedMember(std::vector<ParameterizedItem>, const Parameters&); - // Shorthand constructor for a member which is a single Item. - ParameterizedMember(Item, const Parameters&); - ~ParameterizedMember(); -}; - -inline bool operator==(const ParameterizedMember& lhs, - const ParameterizedMember& rhs) { - return std::tie(lhs.member, lhs.member_is_inner_list, lhs.params) == - std::tie(rhs.member, rhs.member_is_inner_list, rhs.params); +inline absl::optional<std::string> SerializeList(const List& value) { + return quiche::structured_headers::SerializeList(value); } - -using DictionaryMember = std::pair<std::string, ParameterizedMember>; - -// Structured Headers Draft 15 Dictionary. -class NET_EXPORT Dictionary { - public: - using iterator = std::vector<DictionaryMember>::iterator; - using const_iterator = std::vector<DictionaryMember>::const_iterator; - - Dictionary(); - Dictionary(const Dictionary&); - explicit Dictionary(std::vector<DictionaryMember> members); - ~Dictionary(); - Dictionary& operator=(const Dictionary&) = default; - iterator begin(); - const_iterator begin() const; - iterator end(); - const_iterator end() const; - - // operator[](size_t) and at(size_t) will both abort the program in case of - // out of bounds access. - ParameterizedMember& operator[](std::size_t idx); - const ParameterizedMember& operator[](std::size_t idx) const; - ParameterizedMember& at(std::size_t idx); - const ParameterizedMember& at(std::size_t idx) const; - - // Consistent with std::map, if |key| does not exist in the Dictionary, then - // operator[](base::StringPiece) will create an entry for it, but at() will - // abort the entire program. - ParameterizedMember& operator[](base::StringPiece key); - ParameterizedMember& at(base::StringPiece key); - const ParameterizedMember& at(base::StringPiece key) const; - - bool empty() const; - std::size_t size() const; - bool contains(base::StringPiece key) const; - friend bool operator==(const Dictionary& lhs, const Dictionary& rhs); - friend bool operator!=(const Dictionary& lhs, const Dictionary& rhs); - - private: - // Uses a vector to hold pairs of key and dictionary member. This makes - // look up by index and serialization much easier. - std::vector<DictionaryMember> members_; -}; - -inline bool operator==(const Dictionary& lhs, const Dictionary& rhs) { - return lhs.members_ == rhs.members_; +inline absl::optional<std::string> SerializeDictionary( + const Dictionary& value) { + return quiche::structured_headers::SerializeDictionary(value); } -inline bool operator!=(const Dictionary& lhs, const Dictionary& rhs) { - return !(lhs == rhs); -} - -// Structured Headers Draft 09 Parameterised List. -using ParameterisedList = std::vector<ParameterisedIdentifier>; -// Structured Headers Draft 09 List of Lists. -using ListOfLists = std::vector<std::vector<Item>>; -// Structured Headers Draft 15 List. -using List = std::vector<ParameterizedMember>; - -// Returns the result of parsing the header value as an Item, if it can be -// parsed as one, or nullopt if it cannot. Note that this uses the Draft 15 -// parsing rules, and so applies tighter range limits to integers. -NET_EXPORT absl::optional<ParameterizedItem> ParseItem(base::StringPiece str); - -// Returns the result of parsing the header value as an Item with no parameters, -// or nullopt if it cannot. Note that this uses the Draft 15 parsing rules, and -// so applies tighter range limits to integers. -NET_EXPORT absl::optional<Item> ParseBareItem(base::StringPiece str); - -// Returns the result of parsing the header value as a Parameterised List, if it -// can be parsed as one, or nullopt if it cannot. Note that parameter keys will -// be returned as strings, which are guaranteed to be ASCII-encoded. List items, -// as well as parameter values, will be returned as Items. This method uses the -// Draft 09 parsing rules for Items, so integers have the 64-bit int range. -// Structured-Headers Draft 09 only. -NET_EXPORT absl::optional<ParameterisedList> ParseParameterisedList( - base::StringPiece str); - -// Returns the result of parsing the header value as a List of Lists, if it can -// be parsed as one, or nullopt if it cannot. Inner list items will be returned -// as Items. This method uses the Draft 09 parsing rules for Items, so integers -// have the 64-bit int range. -// Structured-Headers Draft 09 only. -NET_EXPORT absl::optional<ListOfLists> ParseListOfLists(base::StringPiece str); - -// Returns the result of parsing the header value as a general List, if it can -// be parsed as one, or nullopt if it cannot. -// Structured-Headers Draft 15 only. -NET_EXPORT absl::optional<List> ParseList(base::StringPiece str); - -// Returns the result of parsing the header value as a general Dictionary, if it -// can be parsed as one, or nullopt if it cannot. Structured-Headers Draft 15 -// only. -NET_EXPORT absl::optional<Dictionary> ParseDictionary( - const base::StringPiece& str); - -// Serialization is implemented for Structured-Headers Draft 15 only. -NET_EXPORT absl::optional<std::string> SerializeItem(const Item& value); -NET_EXPORT absl::optional<std::string> SerializeItem( - const ParameterizedItem& value); -NET_EXPORT absl::optional<std::string> SerializeList(const List& value); -NET_EXPORT absl::optional<std::string> SerializeDictionary( - const Dictionary& value); - } // namespace structured_headers } // namespace net
diff --git a/net/http/structured_headers_generated_unittest.cc b/net/http/structured_headers_generated_unittest.cc deleted file mode 100644 index 82d1e01..0000000 --- a/net/http/structured_headers_generated_unittest.cc +++ /dev/null
@@ -1,3178 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/http/structured_headers.h" - -#include <math.h> - -#include <limits> -#include <string> - -#include "testing/gtest/include/gtest/gtest.h" - -// This file contains tests cases for the Structured Header parser and -// serializer, taken from the public test case repository at -// https://github.com/httpwg/structured-field-tests. All of the tests are named, -// so a given test case can be found in the JSON files in that repository by -// searching for the test name. This file is generated, with the test cases -// being automatically translated from the JSON source to C++ unit tests. Please -// do not modify, as the contents will be overwritten when this is re-generated. - -// Generated on 2022-03-05 from structured-field-tests.git @ -// 4d33b9c2f4e0a7d7d1d733ccf48783aaead8ca4d - -namespace net { -namespace structured_headers { -namespace { - -// Helpers to make test cases clearer - -Item Integer(int64_t value) { - return Item(value); -} - -std::pair<std::string, Item> BooleanParam(std::string key, bool value) { - return std::make_pair(key, Item(value)); -} - -std::pair<std::string, Item> DoubleParam(std::string key, double value) { - return std::make_pair(key, Item(value)); -} - -std::pair<std::string, Item> Param(std::string key, int64_t value) { - return std::make_pair(key, Item(value)); -} - -std::pair<std::string, Item> Param(std::string key, std::string value) { - return std::make_pair(key, Item(value)); -} - -std::pair<std::string, Item> TokenParam(std::string key, std::string value) { - return std::make_pair(key, Item(value, Item::kTokenType)); -} - -const struct ParameterizedItemTestCase { - const char* name; - const char* raw; - size_t raw_len; - const absl::optional<ParameterizedItem> - expected; // nullopt if parse error is expected. - const char* canonical; // nullptr if parse error is expected, or if canonical - // format is identical to raw. -} parameterized_item_test_cases[] = { - - // binary.json - {"basic binary", - ":aGVsbG8=:", - 10, - {{Item("hello", Item::kByteSequenceType), {}}}}, - {"empty binary", "::", 2, {{Item("", Item::kByteSequenceType), {}}}}, - {"bad paddding", - ":aGVsbG8:", - 9, - {{Item("hello", Item::kByteSequenceType), {}}}, - ":aGVsbG8=:"}, - {"bad end delimiter", ":aGVsbG8=", 9, absl::nullopt}, - {"extra whitespace", ":aGVsb G8=:", 11, absl::nullopt}, - {"extra chars", ":aGVsbG!8=:", 11, absl::nullopt}, - {"suffix chars", ":aGVsbG8=!:", 11, absl::nullopt}, - {"non-zero pad bits", - ":iZ==:", - 6, - {{Item("\211", Item::kByteSequenceType), {}}}, - ":iQ==:"}, - {"non-ASCII binary", - ":/+Ah:", - 6, - {{Item("\377\340!", Item::kByteSequenceType), {}}}}, - {"base64url binary", ":_-Ah:", 6, absl::nullopt}, - // boolean.json - {"basic true boolean", "?1", 2, {{Item(true), {}}}}, - {"basic false boolean", "?0", 2, {{Item(false), {}}}}, - {"unknown boolean", "?Q", 2, absl::nullopt}, - {"whitespace boolean", "? 1", 3, absl::nullopt}, - {"negative zero boolean", "?-0", 3, absl::nullopt}, - {"T boolean", "?T", 2, absl::nullopt}, - {"F boolean", "?F", 2, absl::nullopt}, - {"t boolean", "?t", 2, absl::nullopt}, - {"f boolean", "?f", 2, absl::nullopt}, - {"spelled-out True boolean", "?True", 5, absl::nullopt}, - {"spelled-out False boolean", "?False", 6, absl::nullopt}, - // examples.json - {"Foo-Example", - "2; foourl=\"https://foo.example.com/\"", - 36, - {{Integer(2), {Param("foourl", "https://foo.example.com/")}}}, - "2;foourl=\"https://foo.example.com/\""}, - {"Example-IntHeader", - "1; a; b=?0", - 10, - {{Integer(1), {BooleanParam("a", true), BooleanParam("b", false)}}}, - "1;a;b=?0"}, - {"Example-IntItemHeader", "5", 1, {{Integer(5), {}}}}, - {"Example-IntItemHeader (params)", - "5; foo=bar", - 10, - {{Integer(5), {TokenParam("foo", "bar")}}}, - "5;foo=bar"}, - {"Example-IntegerHeader", "42", 2, {{Integer(42), {}}}}, - {"Example-FloatHeader", "4.5", 3, {{Item(4.500000), {}}}}, - {"Example-StringHeader", - "\"hello world\"", - 13, - {{Item("hello world"), {}}}}, - {"Example-BinaryHdr", - ":cHJldGVuZCB0aGlzIGlzIGJpbmFyeSBjb250ZW50Lg==:", - 46, - {{Item("pretend this is binary content.", Item::kByteSequenceType), {}}}}, - {"Example-BoolHdr", "?1", 2, {{Item(true), {}}}}, - // item.json - {"empty item", "", 0, absl::nullopt}, - {"leading space", " \t 1", 4, absl::nullopt}, - {"trailing space", "1 \t ", 4, absl::nullopt}, - {"leading and trailing space", " 1 ", 5, {{Integer(1), {}}}, "1"}, - {"leading and trailing whitespace", " 1 ", 8, {{Integer(1), {}}}, "1"}, - // number-generated.json - {"1 digits of zero", "0", 1, {{Integer(0), {}}}, "0"}, - {"1 digit small integer", "1", 1, {{Integer(1), {}}}}, - {"1 digit large integer", "9", 1, {{Integer(9), {}}}}, - {"2 digits of zero", "00", 2, {{Integer(0), {}}}, "0"}, - {"2 digit small integer", "11", 2, {{Integer(11), {}}}}, - {"2 digit large integer", "99", 2, {{Integer(99), {}}}}, - {"3 digits of zero", "000", 3, {{Integer(0), {}}}, "0"}, - {"3 digit small integer", "111", 3, {{Integer(111), {}}}}, - {"3 digit large integer", "999", 3, {{Integer(999), {}}}}, - {"4 digits of zero", "0000", 4, {{Integer(0), {}}}, "0"}, - {"4 digit small integer", "1111", 4, {{Integer(1111), {}}}}, - {"4 digit large integer", "9999", 4, {{Integer(9999), {}}}}, - {"5 digits of zero", "00000", 5, {{Integer(0), {}}}, "0"}, - {"5 digit small integer", "11111", 5, {{Integer(11111), {}}}}, - {"5 digit large integer", "99999", 5, {{Integer(99999), {}}}}, - {"6 digits of zero", "000000", 6, {{Integer(0), {}}}, "0"}, - {"6 digit small integer", "111111", 6, {{Integer(111111), {}}}}, - {"6 digit large integer", "999999", 6, {{Integer(999999), {}}}}, - {"7 digits of zero", "0000000", 7, {{Integer(0), {}}}, "0"}, - {"7 digit small integer", "1111111", 7, {{Integer(1111111), {}}}}, - {"7 digit large integer", "9999999", 7, {{Integer(9999999), {}}}}, - {"8 digits of zero", "00000000", 8, {{Integer(0), {}}}, "0"}, - {"8 digit small integer", "11111111", 8, {{Integer(11111111), {}}}}, - {"8 digit large integer", "99999999", 8, {{Integer(99999999), {}}}}, - {"9 digits of zero", "000000000", 9, {{Integer(0), {}}}, "0"}, - {"9 digit small integer", "111111111", 9, {{Integer(111111111), {}}}}, - {"9 digit large integer", "999999999", 9, {{Integer(999999999), {}}}}, - {"10 digits of zero", "0000000000", 10, {{Integer(0), {}}}, "0"}, - {"10 digit small integer", "1111111111", 10, {{Integer(1111111111), {}}}}, - {"10 digit large integer", "9999999999", 10, {{Integer(9999999999), {}}}}, - {"11 digits of zero", "00000000000", 11, {{Integer(0), {}}}, "0"}, - {"11 digit small integer", "11111111111", 11, {{Integer(11111111111), {}}}}, - {"11 digit large integer", "99999999999", 11, {{Integer(99999999999), {}}}}, - {"12 digits of zero", "000000000000", 12, {{Integer(0), {}}}, "0"}, - {"12 digit small integer", - "111111111111", - 12, - {{Integer(111111111111), {}}}}, - {"12 digit large integer", - "999999999999", - 12, - {{Integer(999999999999), {}}}}, - {"13 digits of zero", "0000000000000", 13, {{Integer(0), {}}}, "0"}, - {"13 digit small integer", - "1111111111111", - 13, - {{Integer(1111111111111), {}}}}, - {"13 digit large integer", - "9999999999999", - 13, - {{Integer(9999999999999), {}}}}, - {"14 digits of zero", "00000000000000", 14, {{Integer(0), {}}}, "0"}, - {"14 digit small integer", - "11111111111111", - 14, - {{Integer(11111111111111), {}}}}, - {"14 digit large integer", - "99999999999999", - 14, - {{Integer(99999999999999), {}}}}, - {"15 digits of zero", "000000000000000", 15, {{Integer(0), {}}}, "0"}, - {"15 digit small integer", - "111111111111111", - 15, - {{Integer(111111111111111), {}}}}, - {"15 digit large integer", - "999999999999999", - 15, - {{Integer(999999999999999), {}}}}, - {"2 digit 0, 1 fractional small decimal", - "0.1", - 3, - {{Item(0.100000), {}}}, - "0.1"}, - {"2 digit, 1 fractional 0 decimal", - "1.0", - 3, - {{Item(1.000000), {}}}, - "1.0"}, - {"2 digit, 1 fractional small decimal", "1.1", 3, {{Item(1.100000), {}}}}, - {"2 digit, 1 fractional large decimal", "9.9", 3, {{Item(9.900000), {}}}}, - {"3 digit 0, 2 fractional small decimal", - "0.11", - 4, - {{Item(0.110000), {}}}, - "0.11"}, - {"3 digit, 2 fractional 0 decimal", - "1.00", - 4, - {{Item(1.000000), {}}}, - "1.0"}, - {"3 digit, 2 fractional small decimal", "1.11", 4, {{Item(1.110000), {}}}}, - {"3 digit, 2 fractional large decimal", "9.99", 4, {{Item(9.990000), {}}}}, - {"4 digit 0, 3 fractional small decimal", - "0.111", - 5, - {{Item(0.111000), {}}}, - "0.111"}, - {"4 digit, 3 fractional 0 decimal", - "1.000", - 5, - {{Item(1.000000), {}}}, - "1.0"}, - {"4 digit, 3 fractional small decimal", "1.111", 5, {{Item(1.111000), {}}}}, - {"4 digit, 3 fractional large decimal", "9.999", 5, {{Item(9.999000), {}}}}, - {"3 digit 0, 1 fractional small decimal", - "00.1", - 4, - {{Item(0.100000), {}}}, - "0.1"}, - {"3 digit, 1 fractional 0 decimal", - "11.0", - 4, - {{Item(11.000000), {}}}, - "11.0"}, - {"3 digit, 1 fractional small decimal", "11.1", 4, {{Item(11.100000), {}}}}, - {"3 digit, 1 fractional large decimal", "99.9", 4, {{Item(99.900000), {}}}}, - {"4 digit 0, 2 fractional small decimal", - "00.11", - 5, - {{Item(0.110000), {}}}, - "0.11"}, - {"4 digit, 2 fractional 0 decimal", - "11.00", - 5, - {{Item(11.000000), {}}}, - "11.0"}, - {"4 digit, 2 fractional small decimal", - "11.11", - 5, - {{Item(11.110000), {}}}}, - {"4 digit, 2 fractional large decimal", - "99.99", - 5, - {{Item(99.990000), {}}}}, - {"5 digit 0, 3 fractional small decimal", - "00.111", - 6, - {{Item(0.111000), {}}}, - "0.111"}, - {"5 digit, 3 fractional 0 decimal", - "11.000", - 6, - {{Item(11.000000), {}}}, - "11.0"}, - {"5 digit, 3 fractional small decimal", - "11.111", - 6, - {{Item(11.111000), {}}}}, - {"5 digit, 3 fractional large decimal", - "99.999", - 6, - {{Item(99.999000), {}}}}, - {"4 digit 0, 1 fractional small decimal", - "000.1", - 5, - {{Item(0.100000), {}}}, - "0.1"}, - {"4 digit, 1 fractional 0 decimal", - "111.0", - 5, - {{Item(111.000000), {}}}, - "111.0"}, - {"4 digit, 1 fractional small decimal", - "111.1", - 5, - {{Item(111.100000), {}}}}, - {"4 digit, 1 fractional large decimal", - "999.9", - 5, - {{Item(999.900000), {}}}}, - {"5 digit 0, 2 fractional small decimal", - "000.11", - 6, - {{Item(0.110000), {}}}, - "0.11"}, - {"5 digit, 2 fractional 0 decimal", - "111.00", - 6, - {{Item(111.000000), {}}}, - "111.0"}, - {"5 digit, 2 fractional small decimal", - "111.11", - 6, - {{Item(111.110000), {}}}}, - {"5 digit, 2 fractional large decimal", - "999.99", - 6, - {{Item(999.990000), {}}}}, - {"6 digit 0, 3 fractional small decimal", - "000.111", - 7, - {{Item(0.111000), {}}}, - "0.111"}, - {"6 digit, 3 fractional 0 decimal", - "111.000", - 7, - {{Item(111.000000), {}}}, - "111.0"}, - {"6 digit, 3 fractional small decimal", - "111.111", - 7, - {{Item(111.111000), {}}}}, - {"6 digit, 3 fractional large decimal", - "999.999", - 7, - {{Item(999.999000), {}}}}, - {"5 digit 0, 1 fractional small decimal", - "0000.1", - 6, - {{Item(0.100000), {}}}, - "0.1"}, - {"5 digit, 1 fractional 0 decimal", - "1111.0", - 6, - {{Item(1111.000000), {}}}, - "1111.0"}, - {"5 digit, 1 fractional small decimal", - "1111.1", - 6, - {{Item(1111.100000), {}}}}, - {"5 digit, 1 fractional large decimal", - "9999.9", - 6, - {{Item(9999.900000), {}}}}, - {"6 digit 0, 2 fractional small decimal", - "0000.11", - 7, - {{Item(0.110000), {}}}, - "0.11"}, - {"6 digit, 2 fractional 0 decimal", - "1111.00", - 7, - {{Item(1111.000000), {}}}, - "1111.0"}, - {"6 digit, 2 fractional small decimal", - "1111.11", - 7, - {{Item(1111.110000), {}}}}, - {"6 digit, 2 fractional large decimal", - "9999.99", - 7, - {{Item(9999.990000), {}}}}, - {"7 digit 0, 3 fractional small decimal", - "0000.111", - 8, - {{Item(0.111000), {}}}, - "0.111"}, - {"7 digit, 3 fractional 0 decimal", - "1111.000", - 8, - {{Item(1111.000000), {}}}, - "1111.0"}, - {"7 digit, 3 fractional small decimal", - "1111.111", - 8, - {{Item(1111.111000), {}}}}, - {"7 digit, 3 fractional large decimal", - "9999.999", - 8, - {{Item(9999.999000), {}}}}, - {"6 digit 0, 1 fractional small decimal", - "00000.1", - 7, - {{Item(0.100000), {}}}, - "0.1"}, - {"6 digit, 1 fractional 0 decimal", - "11111.0", - 7, - {{Item(11111.000000), {}}}, - "11111.0"}, - {"6 digit, 1 fractional small decimal", - "11111.1", - 7, - {{Item(11111.100000), {}}}}, - {"6 digit, 1 fractional large decimal", - "99999.9", - 7, - {{Item(99999.900000), {}}}}, - {"7 digit 0, 2 fractional small decimal", - "00000.11", - 8, - {{Item(0.110000), {}}}, - "0.11"}, - {"7 digit, 2 fractional 0 decimal", - "11111.00", - 8, - {{Item(11111.000000), {}}}, - "11111.0"}, - {"7 digit, 2 fractional small decimal", - "11111.11", - 8, - {{Item(11111.110000), {}}}}, - {"7 digit, 2 fractional large decimal", - "99999.99", - 8, - {{Item(99999.990000), {}}}}, - {"8 digit 0, 3 fractional small decimal", - "00000.111", - 9, - {{Item(0.111000), {}}}, - "0.111"}, - {"8 digit, 3 fractional 0 decimal", - "11111.000", - 9, - {{Item(11111.000000), {}}}, - "11111.0"}, - {"8 digit, 3 fractional small decimal", - "11111.111", - 9, - {{Item(11111.111000), {}}}}, - {"8 digit, 3 fractional large decimal", - "99999.999", - 9, - {{Item(99999.999000), {}}}}, - {"7 digit 0, 1 fractional small decimal", - "000000.1", - 8, - {{Item(0.100000), {}}}, - "0.1"}, - {"7 digit, 1 fractional 0 decimal", - "111111.0", - 8, - {{Item(111111.000000), {}}}, - "111111.0"}, - {"7 digit, 1 fractional small decimal", - "111111.1", - 8, - {{Item(111111.100000), {}}}}, - {"7 digit, 1 fractional large decimal", - "999999.9", - 8, - {{Item(999999.900000), {}}}}, - {"8 digit 0, 2 fractional small decimal", - "000000.11", - 9, - {{Item(0.110000), {}}}, - "0.11"}, - {"8 digit, 2 fractional 0 decimal", - "111111.00", - 9, - {{Item(111111.000000), {}}}, - "111111.0"}, - {"8 digit, 2 fractional small decimal", - "111111.11", - 9, - {{Item(111111.110000), {}}}}, - {"8 digit, 2 fractional large decimal", - "999999.99", - 9, - {{Item(999999.990000), {}}}}, - {"9 digit 0, 3 fractional small decimal", - "000000.111", - 10, - {{Item(0.111000), {}}}, - "0.111"}, - {"9 digit, 3 fractional 0 decimal", - "111111.000", - 10, - {{Item(111111.000000), {}}}, - "111111.0"}, - {"9 digit, 3 fractional small decimal", - "111111.111", - 10, - {{Item(111111.111000), {}}}}, - {"9 digit, 3 fractional large decimal", - "999999.999", - 10, - {{Item(999999.999000), {}}}}, - {"8 digit 0, 1 fractional small decimal", - "0000000.1", - 9, - {{Item(0.100000), {}}}, - "0.1"}, - {"8 digit, 1 fractional 0 decimal", - "1111111.0", - 9, - {{Item(1111111.000000), {}}}, - "1111111.0"}, - {"8 digit, 1 fractional small decimal", - "1111111.1", - 9, - {{Item(1111111.100000), {}}}}, - {"8 digit, 1 fractional large decimal", - "9999999.9", - 9, - {{Item(9999999.900000), {}}}}, - {"9 digit 0, 2 fractional small decimal", - "0000000.11", - 10, - {{Item(0.110000), {}}}, - "0.11"}, - {"9 digit, 2 fractional 0 decimal", - "1111111.00", - 10, - {{Item(1111111.000000), {}}}, - "1111111.0"}, - {"9 digit, 2 fractional small decimal", - "1111111.11", - 10, - {{Item(1111111.110000), {}}}}, - {"9 digit, 2 fractional large decimal", - "9999999.99", - 10, - {{Item(9999999.990000), {}}}}, - {"10 digit 0, 3 fractional small decimal", - "0000000.111", - 11, - {{Item(0.111000), {}}}, - "0.111"}, - {"10 digit, 3 fractional 0 decimal", - "1111111.000", - 11, - {{Item(1111111.000000), {}}}, - "1111111.0"}, - {"10 digit, 3 fractional small decimal", - "1111111.111", - 11, - {{Item(1111111.111000), {}}}}, - {"10 digit, 3 fractional large decimal", - "9999999.999", - 11, - {{Item(9999999.999000), {}}}}, - {"9 digit 0, 1 fractional small decimal", - "00000000.1", - 10, - {{Item(0.100000), {}}}, - "0.1"}, - {"9 digit, 1 fractional 0 decimal", - "11111111.0", - 10, - {{Item(11111111.000000), {}}}, - "11111111.0"}, - {"9 digit, 1 fractional small decimal", - "11111111.1", - 10, - {{Item(11111111.100000), {}}}}, - {"9 digit, 1 fractional large decimal", - "99999999.9", - 10, - {{Item(99999999.900000), {}}}}, - {"10 digit 0, 2 fractional small decimal", - "00000000.11", - 11, - {{Item(0.110000), {}}}, - "0.11"}, - {"10 digit, 2 fractional 0 decimal", - "11111111.00", - 11, - {{Item(11111111.000000), {}}}, - "11111111.0"}, - {"10 digit, 2 fractional small decimal", - "11111111.11", - 11, - {{Item(11111111.110000), {}}}}, - {"10 digit, 2 fractional large decimal", - "99999999.99", - 11, - {{Item(99999999.990000), {}}}}, - {"11 digit 0, 3 fractional small decimal", - "00000000.111", - 12, - {{Item(0.111000), {}}}, - "0.111"}, - {"11 digit, 3 fractional 0 decimal", - "11111111.000", - 12, - {{Item(11111111.000000), {}}}, - "11111111.0"}, - {"11 digit, 3 fractional small decimal", - "11111111.111", - 12, - {{Item(11111111.111000), {}}}}, - {"11 digit, 3 fractional large decimal", - "99999999.999", - 12, - {{Item(99999999.999000), {}}}}, - {"10 digit 0, 1 fractional small decimal", - "000000000.1", - 11, - {{Item(0.100000), {}}}, - "0.1"}, - {"10 digit, 1 fractional 0 decimal", - "111111111.0", - 11, - {{Item(111111111.000000), {}}}, - "111111111.0"}, - {"10 digit, 1 fractional small decimal", - "111111111.1", - 11, - {{Item(111111111.100000), {}}}}, - {"10 digit, 1 fractional large decimal", - "999999999.9", - 11, - {{Item(999999999.900000), {}}}}, - {"11 digit 0, 2 fractional small decimal", - "000000000.11", - 12, - {{Item(0.110000), {}}}, - "0.11"}, - {"11 digit, 2 fractional 0 decimal", - "111111111.00", - 12, - {{Item(111111111.000000), {}}}, - "111111111.0"}, - {"11 digit, 2 fractional small decimal", - "111111111.11", - 12, - {{Item(111111111.110000), {}}}}, - {"11 digit, 2 fractional large decimal", - "999999999.99", - 12, - {{Item(999999999.990000), {}}}}, - {"12 digit 0, 3 fractional small decimal", - "000000000.111", - 13, - {{Item(0.111000), {}}}, - "0.111"}, - {"12 digit, 3 fractional 0 decimal", - "111111111.000", - 13, - {{Item(111111111.000000), {}}}, - "111111111.0"}, - {"12 digit, 3 fractional small decimal", - "111111111.111", - 13, - {{Item(111111111.111000), {}}}}, - {"12 digit, 3 fractional large decimal", - "999999999.999", - 13, - {{Item(999999999.999000), {}}}}, - {"11 digit 0, 1 fractional small decimal", - "0000000000.1", - 12, - {{Item(0.100000), {}}}, - "0.1"}, - {"11 digit, 1 fractional 0 decimal", - "1111111111.0", - 12, - {{Item(1111111111.000000), {}}}, - "1111111111.0"}, - {"11 digit, 1 fractional small decimal", - "1111111111.1", - 12, - {{Item(1111111111.100000), {}}}}, - {"11 digit, 1 fractional large decimal", - "9999999999.9", - 12, - {{Item(9999999999.900000), {}}}}, - {"12 digit 0, 2 fractional small decimal", - "0000000000.11", - 13, - {{Item(0.110000), {}}}, - "0.11"}, - {"12 digit, 2 fractional 0 decimal", - "1111111111.00", - 13, - {{Item(1111111111.000000), {}}}, - "1111111111.0"}, - {"12 digit, 2 fractional small decimal", - "1111111111.11", - 13, - {{Item(1111111111.110000), {}}}}, - {"12 digit, 2 fractional large decimal", - "9999999999.99", - 13, - {{Item(9999999999.990000), {}}}}, - {"13 digit 0, 3 fractional small decimal", - "0000000000.111", - 14, - {{Item(0.111000), {}}}, - "0.111"}, - {"13 digit, 3 fractional 0 decimal", - "1111111111.000", - 14, - {{Item(1111111111.000000), {}}}, - "1111111111.0"}, - {"13 digit, 3 fractional small decimal", - "1111111111.111", - 14, - {{Item(1111111111.111000), {}}}}, - {"13 digit, 3 fractional large decimal", - "9999999999.999", - 14, - {{Item(9999999999.999001), {}}}}, - {"12 digit 0, 1 fractional small decimal", - "00000000000.1", - 13, - {{Item(0.100000), {}}}, - "0.1"}, - {"12 digit, 1 fractional 0 decimal", - "11111111111.0", - 13, - {{Item(11111111111.000000), {}}}, - "11111111111.0"}, - {"12 digit, 1 fractional small decimal", - "11111111111.1", - 13, - {{Item(11111111111.100000), {}}}}, - {"12 digit, 1 fractional large decimal", - "99999999999.9", - 13, - {{Item(99999999999.899994), {}}}}, - {"13 digit 0, 2 fractional small decimal", - "00000000000.11", - 14, - {{Item(0.110000), {}}}, - "0.11"}, - {"13 digit, 2 fractional 0 decimal", - "11111111111.00", - 14, - {{Item(11111111111.000000), {}}}, - "11111111111.0"}, - {"13 digit, 2 fractional small decimal", - "11111111111.11", - 14, - {{Item(11111111111.110001), {}}}}, - {"13 digit, 2 fractional large decimal", - "99999999999.99", - 14, - {{Item(99999999999.990005), {}}}}, - {"14 digit 0, 3 fractional small decimal", - "00000000000.111", - 15, - {{Item(0.111000), {}}}, - "0.111"}, - {"14 digit, 3 fractional 0 decimal", - "11111111111.000", - 15, - {{Item(11111111111.000000), {}}}, - "11111111111.0"}, - {"14 digit, 3 fractional small decimal", - "11111111111.111", - 15, - {{Item(11111111111.111000), {}}}}, - {"14 digit, 3 fractional large decimal", - "99999999999.999", - 15, - {{Item(99999999999.998993), {}}}}, - {"13 digit 0, 1 fractional small decimal", - "000000000000.1", - 14, - {{Item(0.100000), {}}}, - "0.1"}, - {"13 digit, 1 fractional 0 decimal", - "111111111111.0", - 14, - {{Item(111111111111.000000), {}}}, - "111111111111.0"}, - {"13 digit, 1 fractional small decimal", - "111111111111.1", - 14, - {{Item(111111111111.100006), {}}}}, - {"13 digit, 1 fractional large decimal", - "999999999999.9", - 14, - {{Item(999999999999.900024), {}}}}, - {"14 digit 0, 2 fractional small decimal", - "000000000000.11", - 15, - {{Item(0.110000), {}}}, - "0.11"}, - {"14 digit, 2 fractional 0 decimal", - "111111111111.00", - 15, - {{Item(111111111111.000000), {}}}, - "111111111111.0"}, - {"14 digit, 2 fractional small decimal", - "111111111111.11", - 15, - {{Item(111111111111.110001), {}}}}, - {"14 digit, 2 fractional large decimal", - "999999999999.99", - 15, - {{Item(999999999999.989990), {}}}}, - {"15 digit 0, 3 fractional small decimal", - "000000000000.111", - 16, - {{Item(0.111000), {}}}, - "0.111"}, - {"15 digit, 3 fractional 0 decimal", - "111111111111.000", - 16, - {{Item(111111111111.000000), {}}}, - "111111111111.0"}, - {"15 digit, 3 fractional small decimal", - "111111111111.111", - 16, - {{Item(111111111111.110992), {}}}}, - {"15 digit, 3 fractional large decimal", - "999999999999.999", - 16, - {{Item(999999999999.999023), {}}}}, - {"too many digit 0 decimal", "000000000000000.0", 17, absl::nullopt}, - {"too many fractional digits 0 decimal", "000000000000.0000", 17, - absl::nullopt}, - {"too many digit 9 decimal", "999999999999999.9", 17, absl::nullopt}, - {"too many fractional digits 9 decimal", "999999999999.9999", 17, - absl::nullopt}, - // number.json - {"basic integer", "42", 2, {{Integer(42), {}}}}, - {"zero integer", "0", 1, {{Integer(0), {}}}}, - {"negative zero", "-0", 2, {{Integer(0), {}}}, "0"}, - {"double negative zero", "--0", 3, absl::nullopt}, - {"negative integer", "-42", 3, {{Integer(-42), {}}}}, - {"leading 0 integer", "042", 3, {{Integer(42), {}}}, "42"}, - {"leading 0 negative integer", "-042", 4, {{Integer(-42), {}}}, "-42"}, - {"leading 0 zero", "00", 2, {{Integer(0), {}}}, "0"}, - {"comma", "2,3", 3, absl::nullopt}, - {"negative non-DIGIT first character", "-a23", 4, absl::nullopt}, - {"sign out of place", "4-2", 3, absl::nullopt}, - {"whitespace after sign", "- 42", 4, absl::nullopt}, - {"long integer", "123456789012345", 15, {{Integer(123456789012345), {}}}}, - {"long negative integer", - "-123456789012345", - 16, - {{Integer(-123456789012345), {}}}}, - {"too long integer", "1234567890123456", 16, absl::nullopt}, - {"negative too long integer", "-1234567890123456", 17, absl::nullopt}, - {"simple decimal", "1.23", 4, {{Item(1.230000), {}}}}, - {"negative decimal", "-1.23", 5, {{Item(-1.230000), {}}}}, - {"decimal, whitespace after decimal", "1. 23", 5, absl::nullopt}, - {"decimal, whitespace before decimal", "1 .23", 5, absl::nullopt}, - {"negative decimal, whitespace after sign", "- 1.23", 6, absl::nullopt}, - {"tricky precision decimal", - "123456789012.1", - 14, - {{Item(123456789012.100006), {}}}}, - {"double decimal decimal", "1.5.4", 5, absl::nullopt}, - {"adjacent double decimal decimal", "1..4", 4, absl::nullopt}, - {"decimal with three fractional digits", - "1.123", - 5, - {{Item(1.123000), {}}}}, - {"negative decimal with three fractional digits", - "-1.123", - 6, - {{Item(-1.123000), {}}}}, - {"decimal with four fractional digits", "1.1234", 6, absl::nullopt}, - {"negative decimal with four fractional digits", "-1.1234", 7, - absl::nullopt}, - {"decimal with thirteen integer digits", "1234567890123.0", 15, - absl::nullopt}, - {"negative decimal with thirteen integer digits", "-1234567890123.0", 16, - absl::nullopt}, - // string-generated.json - {"0x00 in string", "\" \000 \"", 5, absl::nullopt}, - {"0x01 in string", "\" \001 \"", 5, absl::nullopt}, - {"0x02 in string", "\" \002 \"", 5, absl::nullopt}, - {"0x03 in string", "\" \003 \"", 5, absl::nullopt}, - {"0x04 in string", "\" \004 \"", 5, absl::nullopt}, - {"0x05 in string", "\" \005 \"", 5, absl::nullopt}, - {"0x06 in string", "\" \006 \"", 5, absl::nullopt}, - {"0x07 in string", "\" \a \"", 5, absl::nullopt}, - {"0x08 in string", "\" \b \"", 5, absl::nullopt}, - {"0x09 in string", "\" \t \"", 5, absl::nullopt}, - {"0x0a in string", "\" \n \"", 5, absl::nullopt}, - {"0x0b in string", "\" \v \"", 5, absl::nullopt}, - {"0x0c in string", "\" \f \"", 5, absl::nullopt}, - {"0x0d in string", "\" \r \"", 5, absl::nullopt}, - {"0x0e in string", "\" \016 \"", 5, absl::nullopt}, - {"0x0f in string", "\" \017 \"", 5, absl::nullopt}, - {"0x10 in string", "\" \020 \"", 5, absl::nullopt}, - {"0x11 in string", "\" \021 \"", 5, absl::nullopt}, - {"0x12 in string", "\" \022 \"", 5, absl::nullopt}, - {"0x13 in string", "\" \023 \"", 5, absl::nullopt}, - {"0x14 in string", "\" \024 \"", 5, absl::nullopt}, - {"0x15 in string", "\" \025 \"", 5, absl::nullopt}, - {"0x16 in string", "\" \026 \"", 5, absl::nullopt}, - {"0x17 in string", "\" \027 \"", 5, absl::nullopt}, - {"0x18 in string", "\" \030 \"", 5, absl::nullopt}, - {"0x19 in string", "\" \031 \"", 5, absl::nullopt}, - {"0x1a in string", "\" \032 \"", 5, absl::nullopt}, - {"0x1b in string", "\" \033 \"", 5, absl::nullopt}, - {"0x1c in string", "\" \034 \"", 5, absl::nullopt}, - {"0x1d in string", "\" \035 \"", 5, absl::nullopt}, - {"0x1e in string", "\" \036 \"", 5, absl::nullopt}, - {"0x1f in string", "\" \037 \"", 5, absl::nullopt}, - {"0x20 in string", "\" \"", 5, {{Item(" "), {}}}}, - {"0x21 in string", "\" ! \"", 5, {{Item(" ! "), {}}}}, - {"0x22 in string", "\" \" \"", 5, absl::nullopt}, - {"0x23 in string", "\" # \"", 5, {{Item(" # "), {}}}}, - {"0x24 in string", "\" $ \"", 5, {{Item(" $ "), {}}}}, - {"0x25 in string", "\" % \"", 5, {{Item(" % "), {}}}}, - {"0x26 in string", "\" & \"", 5, {{Item(" & "), {}}}}, - {"0x27 in string", "\" ' \"", 5, {{Item(" ' "), {}}}}, - {"0x28 in string", "\" ( \"", 5, {{Item(" ( "), {}}}}, - {"0x29 in string", "\" ) \"", 5, {{Item(" ) "), {}}}}, - {"0x2a in string", "\" * \"", 5, {{Item(" * "), {}}}}, - {"0x2b in string", "\" + \"", 5, {{Item(" + "), {}}}}, - {"0x2c in string", "\" , \"", 5, {{Item(" , "), {}}}}, - {"0x2d in string", "\" - \"", 5, {{Item(" - "), {}}}}, - {"0x2e in string", "\" . \"", 5, {{Item(" . "), {}}}}, - {"0x2f in string", "\" / \"", 5, {{Item(" / "), {}}}}, - {"0x30 in string", "\" 0 \"", 5, {{Item(" 0 "), {}}}}, - {"0x31 in string", "\" 1 \"", 5, {{Item(" 1 "), {}}}}, - {"0x32 in string", "\" 2 \"", 5, {{Item(" 2 "), {}}}}, - {"0x33 in string", "\" 3 \"", 5, {{Item(" 3 "), {}}}}, - {"0x34 in string", "\" 4 \"", 5, {{Item(" 4 "), {}}}}, - {"0x35 in string", "\" 5 \"", 5, {{Item(" 5 "), {}}}}, - {"0x36 in string", "\" 6 \"", 5, {{Item(" 6 "), {}}}}, - {"0x37 in string", "\" 7 \"", 5, {{Item(" 7 "), {}}}}, - {"0x38 in string", "\" 8 \"", 5, {{Item(" 8 "), {}}}}, - {"0x39 in string", "\" 9 \"", 5, {{Item(" 9 "), {}}}}, - {"0x3a in string", "\" : \"", 5, {{Item(" : "), {}}}}, - {"0x3b in string", "\" ; \"", 5, {{Item(" ; "), {}}}}, - {"0x3c in string", "\" < \"", 5, {{Item(" < "), {}}}}, - {"0x3d in string", "\" = \"", 5, {{Item(" = "), {}}}}, - {"0x3e in string", "\" > \"", 5, {{Item(" > "), {}}}}, - {"0x3f in string", "\" ? \"", 5, {{Item(" ? "), {}}}}, - {"0x40 in string", "\" @ \"", 5, {{Item(" @ "), {}}}}, - {"0x41 in string", "\" A \"", 5, {{Item(" A "), {}}}}, - {"0x42 in string", "\" B \"", 5, {{Item(" B "), {}}}}, - {"0x43 in string", "\" C \"", 5, {{Item(" C "), {}}}}, - {"0x44 in string", "\" D \"", 5, {{Item(" D "), {}}}}, - {"0x45 in string", "\" E \"", 5, {{Item(" E "), {}}}}, - {"0x46 in string", "\" F \"", 5, {{Item(" F "), {}}}}, - {"0x47 in string", "\" G \"", 5, {{Item(" G "), {}}}}, - {"0x48 in string", "\" H \"", 5, {{Item(" H "), {}}}}, - {"0x49 in string", "\" I \"", 5, {{Item(" I "), {}}}}, - {"0x4a in string", "\" J \"", 5, {{Item(" J "), {}}}}, - {"0x4b in string", "\" K \"", 5, {{Item(" K "), {}}}}, - {"0x4c in string", "\" L \"", 5, {{Item(" L "), {}}}}, - {"0x4d in string", "\" M \"", 5, {{Item(" M "), {}}}}, - {"0x4e in string", "\" N \"", 5, {{Item(" N "), {}}}}, - {"0x4f in string", "\" O \"", 5, {{Item(" O "), {}}}}, - {"0x50 in string", "\" P \"", 5, {{Item(" P "), {}}}}, - {"0x51 in string", "\" Q \"", 5, {{Item(" Q "), {}}}}, - {"0x52 in string", "\" R \"", 5, {{Item(" R "), {}}}}, - {"0x53 in string", "\" S \"", 5, {{Item(" S "), {}}}}, - {"0x54 in string", "\" T \"", 5, {{Item(" T "), {}}}}, - {"0x55 in string", "\" U \"", 5, {{Item(" U "), {}}}}, - {"0x56 in string", "\" V \"", 5, {{Item(" V "), {}}}}, - {"0x57 in string", "\" W \"", 5, {{Item(" W "), {}}}}, - {"0x58 in string", "\" X \"", 5, {{Item(" X "), {}}}}, - {"0x59 in string", "\" Y \"", 5, {{Item(" Y "), {}}}}, - {"0x5a in string", "\" Z \"", 5, {{Item(" Z "), {}}}}, - {"0x5b in string", "\" [ \"", 5, {{Item(" [ "), {}}}}, - {"0x5c in string", "\" \\ \"", 5, absl::nullopt}, - {"0x5d in string", "\" ] \"", 5, {{Item(" ] "), {}}}}, - {"0x5e in string", "\" ^ \"", 5, {{Item(" ^ "), {}}}}, - {"0x5f in string", "\" _ \"", 5, {{Item(" _ "), {}}}}, - {"0x60 in string", "\" ` \"", 5, {{Item(" ` "), {}}}}, - {"0x61 in string", "\" a \"", 5, {{Item(" a "), {}}}}, - {"0x62 in string", "\" b \"", 5, {{Item(" b "), {}}}}, - {"0x63 in string", "\" c \"", 5, {{Item(" c "), {}}}}, - {"0x64 in string", "\" d \"", 5, {{Item(" d "), {}}}}, - {"0x65 in string", "\" e \"", 5, {{Item(" e "), {}}}}, - {"0x66 in string", "\" f \"", 5, {{Item(" f "), {}}}}, - {"0x67 in string", "\" g \"", 5, {{Item(" g "), {}}}}, - {"0x68 in string", "\" h \"", 5, {{Item(" h "), {}}}}, - {"0x69 in string", "\" i \"", 5, {{Item(" i "), {}}}}, - {"0x6a in string", "\" j \"", 5, {{Item(" j "), {}}}}, - {"0x6b in string", "\" k \"", 5, {{Item(" k "), {}}}}, - {"0x6c in string", "\" l \"", 5, {{Item(" l "), {}}}}, - {"0x6d in string", "\" m \"", 5, {{Item(" m "), {}}}}, - {"0x6e in string", "\" n \"", 5, {{Item(" n "), {}}}}, - {"0x6f in string", "\" o \"", 5, {{Item(" o "), {}}}}, - {"0x70 in string", "\" p \"", 5, {{Item(" p "), {}}}}, - {"0x71 in string", "\" q \"", 5, {{Item(" q "), {}}}}, - {"0x72 in string", "\" r \"", 5, {{Item(" r "), {}}}}, - {"0x73 in string", "\" s \"", 5, {{Item(" s "), {}}}}, - {"0x74 in string", "\" t \"", 5, {{Item(" t "), {}}}}, - {"0x75 in string", "\" u \"", 5, {{Item(" u "), {}}}}, - {"0x76 in string", "\" v \"", 5, {{Item(" v "), {}}}}, - {"0x77 in string", "\" w \"", 5, {{Item(" w "), {}}}}, - {"0x78 in string", "\" x \"", 5, {{Item(" x "), {}}}}, - {"0x79 in string", "\" y \"", 5, {{Item(" y "), {}}}}, - {"0x7a in string", "\" z \"", 5, {{Item(" z "), {}}}}, - {"0x7b in string", "\" { \"", 5, {{Item(" { "), {}}}}, - {"0x7c in string", "\" | \"", 5, {{Item(" | "), {}}}}, - {"0x7d in string", "\" } \"", 5, {{Item(" } "), {}}}}, - {"0x7e in string", "\" ~ \"", 5, {{Item(" ~ "), {}}}}, - {"0x7f in string", "\" \177 \"", 5, absl::nullopt}, - {"Escaped 0x00 in string", "\"\\\000\"", 4, absl::nullopt}, - {"Escaped 0x01 in string", "\"\\\001\"", 4, absl::nullopt}, - {"Escaped 0x02 in string", "\"\\\002\"", 4, absl::nullopt}, - {"Escaped 0x03 in string", "\"\\\003\"", 4, absl::nullopt}, - {"Escaped 0x04 in string", "\"\\\004\"", 4, absl::nullopt}, - {"Escaped 0x05 in string", "\"\\\005\"", 4, absl::nullopt}, - {"Escaped 0x06 in string", "\"\\\006\"", 4, absl::nullopt}, - {"Escaped 0x07 in string", "\"\\\a\"", 4, absl::nullopt}, - {"Escaped 0x08 in string", "\"\\\b\"", 4, absl::nullopt}, - {"Escaped 0x09 in string", "\"\\\t\"", 4, absl::nullopt}, - {"Escaped 0x0a in string", "\"\\\n\"", 4, absl::nullopt}, - {"Escaped 0x0b in string", "\"\\\v\"", 4, absl::nullopt}, - {"Escaped 0x0c in string", "\"\\\f\"", 4, absl::nullopt}, - {"Escaped 0x0d in string", "\"\\\r\"", 4, absl::nullopt}, - {"Escaped 0x0e in string", "\"\\\016\"", 4, absl::nullopt}, - {"Escaped 0x0f in string", "\"\\\017\"", 4, absl::nullopt}, - {"Escaped 0x10 in string", "\"\\\020\"", 4, absl::nullopt}, - {"Escaped 0x11 in string", "\"\\\021\"", 4, absl::nullopt}, - {"Escaped 0x12 in string", "\"\\\022\"", 4, absl::nullopt}, - {"Escaped 0x13 in string", "\"\\\023\"", 4, absl::nullopt}, - {"Escaped 0x14 in string", "\"\\\024\"", 4, absl::nullopt}, - {"Escaped 0x15 in string", "\"\\\025\"", 4, absl::nullopt}, - {"Escaped 0x16 in string", "\"\\\026\"", 4, absl::nullopt}, - {"Escaped 0x17 in string", "\"\\\027\"", 4, absl::nullopt}, - {"Escaped 0x18 in string", "\"\\\030\"", 4, absl::nullopt}, - {"Escaped 0x19 in string", "\"\\\031\"", 4, absl::nullopt}, - {"Escaped 0x1a in string", "\"\\\032\"", 4, absl::nullopt}, - {"Escaped 0x1b in string", "\"\\\033\"", 4, absl::nullopt}, - {"Escaped 0x1c in string", "\"\\\034\"", 4, absl::nullopt}, - {"Escaped 0x1d in string", "\"\\\035\"", 4, absl::nullopt}, - {"Escaped 0x1e in string", "\"\\\036\"", 4, absl::nullopt}, - {"Escaped 0x1f in string", "\"\\\037\"", 4, absl::nullopt}, - {"Escaped 0x20 in string", "\"\\ \"", 4, absl::nullopt}, - {"Escaped 0x21 in string", "\"\\!\"", 4, absl::nullopt}, - {"Escaped 0x22 in string", "\"\\\"\"", 4, {{Item("\""), {}}}}, - {"Escaped 0x23 in string", "\"\\#\"", 4, absl::nullopt}, - {"Escaped 0x24 in string", "\"\\$\"", 4, absl::nullopt}, - {"Escaped 0x25 in string", "\"\\%\"", 4, absl::nullopt}, - {"Escaped 0x26 in string", "\"\\&\"", 4, absl::nullopt}, - {"Escaped 0x27 in string", "\"\\'\"", 4, absl::nullopt}, - {"Escaped 0x28 in string", "\"\\(\"", 4, absl::nullopt}, - {"Escaped 0x29 in string", "\"\\)\"", 4, absl::nullopt}, - {"Escaped 0x2a in string", "\"\\*\"", 4, absl::nullopt}, - {"Escaped 0x2b in string", "\"\\+\"", 4, absl::nullopt}, - {"Escaped 0x2c in string", "\"\\,\"", 4, absl::nullopt}, - {"Escaped 0x2d in string", "\"\\-\"", 4, absl::nullopt}, - {"Escaped 0x2e in string", "\"\\.\"", 4, absl::nullopt}, - {"Escaped 0x2f in string", "\"\\/\"", 4, absl::nullopt}, - {"Escaped 0x30 in string", "\"\\0\"", 4, absl::nullopt}, - {"Escaped 0x31 in string", "\"\\1\"", 4, absl::nullopt}, - {"Escaped 0x32 in string", "\"\\2\"", 4, absl::nullopt}, - {"Escaped 0x33 in string", "\"\\3\"", 4, absl::nullopt}, - {"Escaped 0x34 in string", "\"\\4\"", 4, absl::nullopt}, - {"Escaped 0x35 in string", "\"\\5\"", 4, absl::nullopt}, - {"Escaped 0x36 in string", "\"\\6\"", 4, absl::nullopt}, - {"Escaped 0x37 in string", "\"\\7\"", 4, absl::nullopt}, - {"Escaped 0x38 in string", "\"\\8\"", 4, absl::nullopt}, - {"Escaped 0x39 in string", "\"\\9\"", 4, absl::nullopt}, - {"Escaped 0x3a in string", "\"\\:\"", 4, absl::nullopt}, - {"Escaped 0x3b in string", "\"\\;\"", 4, absl::nullopt}, - {"Escaped 0x3c in string", "\"\\<\"", 4, absl::nullopt}, - {"Escaped 0x3d in string", "\"\\=\"", 4, absl::nullopt}, - {"Escaped 0x3e in string", "\"\\>\"", 4, absl::nullopt}, - {"Escaped 0x3f in string", "\"\\?\"", 4, absl::nullopt}, - {"Escaped 0x40 in string", "\"\\@\"", 4, absl::nullopt}, - {"Escaped 0x41 in string", "\"\\A\"", 4, absl::nullopt}, - {"Escaped 0x42 in string", "\"\\B\"", 4, absl::nullopt}, - {"Escaped 0x43 in string", "\"\\C\"", 4, absl::nullopt}, - {"Escaped 0x44 in string", "\"\\D\"", 4, absl::nullopt}, - {"Escaped 0x45 in string", "\"\\E\"", 4, absl::nullopt}, - {"Escaped 0x46 in string", "\"\\F\"", 4, absl::nullopt}, - {"Escaped 0x47 in string", "\"\\G\"", 4, absl::nullopt}, - {"Escaped 0x48 in string", "\"\\H\"", 4, absl::nullopt}, - {"Escaped 0x49 in string", "\"\\I\"", 4, absl::nullopt}, - {"Escaped 0x4a in string", "\"\\J\"", 4, absl::nullopt}, - {"Escaped 0x4b in string", "\"\\K\"", 4, absl::nullopt}, - {"Escaped 0x4c in string", "\"\\L\"", 4, absl::nullopt}, - {"Escaped 0x4d in string", "\"\\M\"", 4, absl::nullopt}, - {"Escaped 0x4e in string", "\"\\N\"", 4, absl::nullopt}, - {"Escaped 0x4f in string", "\"\\O\"", 4, absl::nullopt}, - {"Escaped 0x50 in string", "\"\\P\"", 4, absl::nullopt}, - {"Escaped 0x51 in string", "\"\\Q\"", 4, absl::nullopt}, - {"Escaped 0x52 in string", "\"\\R\"", 4, absl::nullopt}, - {"Escaped 0x53 in string", "\"\\S\"", 4, absl::nullopt}, - {"Escaped 0x54 in string", "\"\\T\"", 4, absl::nullopt}, - {"Escaped 0x55 in string", "\"\\U\"", 4, absl::nullopt}, - {"Escaped 0x56 in string", "\"\\V\"", 4, absl::nullopt}, - {"Escaped 0x57 in string", "\"\\W\"", 4, absl::nullopt}, - {"Escaped 0x58 in string", "\"\\X\"", 4, absl::nullopt}, - {"Escaped 0x59 in string", "\"\\Y\"", 4, absl::nullopt}, - {"Escaped 0x5a in string", "\"\\Z\"", 4, absl::nullopt}, - {"Escaped 0x5b in string", "\"\\[\"", 4, absl::nullopt}, - {"Escaped 0x5c in string", "\"\\\\\"", 4, {{Item("\\"), {}}}}, - {"Escaped 0x5d in string", "\"\\]\"", 4, absl::nullopt}, - {"Escaped 0x5e in string", "\"\\^\"", 4, absl::nullopt}, - {"Escaped 0x5f in string", "\"\\_\"", 4, absl::nullopt}, - {"Escaped 0x60 in string", "\"\\`\"", 4, absl::nullopt}, - {"Escaped 0x61 in string", "\"\\a\"", 4, absl::nullopt}, - {"Escaped 0x62 in string", "\"\\b\"", 4, absl::nullopt}, - {"Escaped 0x63 in string", "\"\\c\"", 4, absl::nullopt}, - {"Escaped 0x64 in string", "\"\\d\"", 4, absl::nullopt}, - {"Escaped 0x65 in string", "\"\\e\"", 4, absl::nullopt}, - {"Escaped 0x66 in string", "\"\\f\"", 4, absl::nullopt}, - {"Escaped 0x67 in string", "\"\\g\"", 4, absl::nullopt}, - {"Escaped 0x68 in string", "\"\\h\"", 4, absl::nullopt}, - {"Escaped 0x69 in string", "\"\\i\"", 4, absl::nullopt}, - {"Escaped 0x6a in string", "\"\\j\"", 4, absl::nullopt}, - {"Escaped 0x6b in string", "\"\\k\"", 4, absl::nullopt}, - {"Escaped 0x6c in string", "\"\\l\"", 4, absl::nullopt}, - {"Escaped 0x6d in string", "\"\\m\"", 4, absl::nullopt}, - {"Escaped 0x6e in string", "\"\\n\"", 4, absl::nullopt}, - {"Escaped 0x6f in string", "\"\\o\"", 4, absl::nullopt}, - {"Escaped 0x70 in string", "\"\\p\"", 4, absl::nullopt}, - {"Escaped 0x71 in string", "\"\\q\"", 4, absl::nullopt}, - {"Escaped 0x72 in string", "\"\\r\"", 4, absl::nullopt}, - {"Escaped 0x73 in string", "\"\\s\"", 4, absl::nullopt}, - {"Escaped 0x74 in string", "\"\\t\"", 4, absl::nullopt}, - {"Escaped 0x75 in string", "\"\\u\"", 4, absl::nullopt}, - {"Escaped 0x76 in string", "\"\\v\"", 4, absl::nullopt}, - {"Escaped 0x77 in string", "\"\\w\"", 4, absl::nullopt}, - {"Escaped 0x78 in string", "\"\\x\"", 4, absl::nullopt}, - {"Escaped 0x79 in string", "\"\\y\"", 4, absl::nullopt}, - {"Escaped 0x7a in string", "\"\\z\"", 4, absl::nullopt}, - {"Escaped 0x7b in string", "\"\\{\"", 4, absl::nullopt}, - {"Escaped 0x7c in string", "\"\\|\"", 4, absl::nullopt}, - {"Escaped 0x7d in string", "\"\\}\"", 4, absl::nullopt}, - {"Escaped 0x7e in string", "\"\\~\"", 4, absl::nullopt}, - {"Escaped 0x7f in string", "\"\\\177\"", 4, absl::nullopt}, - // string.json - {"basic string", "\"foo bar\"", 9, {{Item("foo bar"), {}}}}, - {"empty string", "\"\"", 2, {{Item(""), {}}}}, - {"long string", - "\"foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo \"", - 262, - {{Item("foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo "), - {}}}}, - {"whitespace string", "\" \"", 5, {{Item(" "), {}}}}, - {"non-ascii string", "\"f\374\374\"", 5, absl::nullopt}, - {"tab in string", "\"\\t\"", 4, absl::nullopt}, - {"newline in string", "\" \\n \"", 6, absl::nullopt}, - {"single quoted string", "'foo'", 5, absl::nullopt}, - {"unbalanced string", "\"foo", 4, absl::nullopt}, - {"string quoting", - "\"foo \\\"bar\\\" \\\\ baz\"", - 20, - {{Item("foo \"bar\" \\ baz"), {}}}}, - {"bad string quoting", "\"foo \\,\"", 8, absl::nullopt}, - {"ending string quote", "\"foo \\\"", 7, absl::nullopt}, - {"abruptly ending string quote", "\"foo \\", 6, absl::nullopt}, - // token-generated.json - {"0x00 in token", "a\000a", 3, absl::nullopt}, - {"0x01 in token", "a\001a", 3, absl::nullopt}, - {"0x02 in token", "a\002a", 3, absl::nullopt}, - {"0x03 in token", "a\003a", 3, absl::nullopt}, - {"0x04 in token", "a\004a", 3, absl::nullopt}, - {"0x05 in token", "a\005a", 3, absl::nullopt}, - {"0x06 in token", "a\006a", 3, absl::nullopt}, - {"0x07 in token", "a\aa", 3, absl::nullopt}, - {"0x08 in token", "a\ba", 3, absl::nullopt}, - {"0x09 in token", "a\ta", 3, absl::nullopt}, - {"0x0a in token", "a\na", 3, absl::nullopt}, - {"0x0b in token", "a\va", 3, absl::nullopt}, - {"0x0c in token", "a\fa", 3, absl::nullopt}, - {"0x0d in token", "a\ra", 3, absl::nullopt}, - {"0x0e in token", "a\016a", 3, absl::nullopt}, - {"0x0f in token", "a\017a", 3, absl::nullopt}, - {"0x10 in token", "a\020a", 3, absl::nullopt}, - {"0x11 in token", "a\021a", 3, absl::nullopt}, - {"0x12 in token", "a\022a", 3, absl::nullopt}, - {"0x13 in token", "a\023a", 3, absl::nullopt}, - {"0x14 in token", "a\024a", 3, absl::nullopt}, - {"0x15 in token", "a\025a", 3, absl::nullopt}, - {"0x16 in token", "a\026a", 3, absl::nullopt}, - {"0x17 in token", "a\027a", 3, absl::nullopt}, - {"0x18 in token", "a\030a", 3, absl::nullopt}, - {"0x19 in token", "a\031a", 3, absl::nullopt}, - {"0x1a in token", "a\032a", 3, absl::nullopt}, - {"0x1b in token", "a\033a", 3, absl::nullopt}, - {"0x1c in token", "a\034a", 3, absl::nullopt}, - {"0x1d in token", "a\035a", 3, absl::nullopt}, - {"0x1e in token", "a\036a", 3, absl::nullopt}, - {"0x1f in token", "a\037a", 3, absl::nullopt}, - {"0x20 in token", "a a", 3, absl::nullopt}, - {"0x21 in token", "a!a", 3, {{Item("a!a", Item::kTokenType), {}}}}, - {"0x22 in token", "a\"a", 3, absl::nullopt}, - {"0x23 in token", "a#a", 3, {{Item("a#a", Item::kTokenType), {}}}}, - {"0x24 in token", "a$a", 3, {{Item("a$a", Item::kTokenType), {}}}}, - {"0x25 in token", "a%a", 3, {{Item("a%a", Item::kTokenType), {}}}}, - {"0x26 in token", "a&a", 3, {{Item("a&a", Item::kTokenType), {}}}}, - {"0x27 in token", "a'a", 3, {{Item("a'a", Item::kTokenType), {}}}}, - {"0x28 in token", "a(a", 3, absl::nullopt}, - {"0x29 in token", "a)a", 3, absl::nullopt}, - {"0x2a in token", "a*a", 3, {{Item("a*a", Item::kTokenType), {}}}}, - {"0x2b in token", "a+a", 3, {{Item("a+a", Item::kTokenType), {}}}}, - {"0x2c in token", "a,a", 3, absl::nullopt}, - {"0x2d in token", "a-a", 3, {{Item("a-a", Item::kTokenType), {}}}}, - {"0x2e in token", "a.a", 3, {{Item("a.a", Item::kTokenType), {}}}}, - {"0x2f in token", "a/a", 3, {{Item("a/a", Item::kTokenType), {}}}}, - {"0x30 in token", "a0a", 3, {{Item("a0a", Item::kTokenType), {}}}}, - {"0x31 in token", "a1a", 3, {{Item("a1a", Item::kTokenType), {}}}}, - {"0x32 in token", "a2a", 3, {{Item("a2a", Item::kTokenType), {}}}}, - {"0x33 in token", "a3a", 3, {{Item("a3a", Item::kTokenType), {}}}}, - {"0x34 in token", "a4a", 3, {{Item("a4a", Item::kTokenType), {}}}}, - {"0x35 in token", "a5a", 3, {{Item("a5a", Item::kTokenType), {}}}}, - {"0x36 in token", "a6a", 3, {{Item("a6a", Item::kTokenType), {}}}}, - {"0x37 in token", "a7a", 3, {{Item("a7a", Item::kTokenType), {}}}}, - {"0x38 in token", "a8a", 3, {{Item("a8a", Item::kTokenType), {}}}}, - {"0x39 in token", "a9a", 3, {{Item("a9a", Item::kTokenType), {}}}}, - {"0x3a in token", "a:a", 3, {{Item("a:a", Item::kTokenType), {}}}}, - {"0x3b in token", - "a;a", - 3, - {{Item("a", Item::kTokenType), {BooleanParam("a", true)}}}}, - {"0x3c in token", "a<a", 3, absl::nullopt}, - {"0x3d in token", "a=a", 3, absl::nullopt}, - {"0x3e in token", "a>a", 3, absl::nullopt}, - {"0x3f in token", "a?a", 3, absl::nullopt}, - {"0x40 in token", "a@a", 3, absl::nullopt}, - {"0x41 in token", "aAa", 3, {{Item("aAa", Item::kTokenType), {}}}}, - {"0x42 in token", "aBa", 3, {{Item("aBa", Item::kTokenType), {}}}}, - {"0x43 in token", "aCa", 3, {{Item("aCa", Item::kTokenType), {}}}}, - {"0x44 in token", "aDa", 3, {{Item("aDa", Item::kTokenType), {}}}}, - {"0x45 in token", "aEa", 3, {{Item("aEa", Item::kTokenType), {}}}}, - {"0x46 in token", "aFa", 3, {{Item("aFa", Item::kTokenType), {}}}}, - {"0x47 in token", "aGa", 3, {{Item("aGa", Item::kTokenType), {}}}}, - {"0x48 in token", "aHa", 3, {{Item("aHa", Item::kTokenType), {}}}}, - {"0x49 in token", "aIa", 3, {{Item("aIa", Item::kTokenType), {}}}}, - {"0x4a in token", "aJa", 3, {{Item("aJa", Item::kTokenType), {}}}}, - {"0x4b in token", "aKa", 3, {{Item("aKa", Item::kTokenType), {}}}}, - {"0x4c in token", "aLa", 3, {{Item("aLa", Item::kTokenType), {}}}}, - {"0x4d in token", "aMa", 3, {{Item("aMa", Item::kTokenType), {}}}}, - {"0x4e in token", "aNa", 3, {{Item("aNa", Item::kTokenType), {}}}}, - {"0x4f in token", "aOa", 3, {{Item("aOa", Item::kTokenType), {}}}}, - {"0x50 in token", "aPa", 3, {{Item("aPa", Item::kTokenType), {}}}}, - {"0x51 in token", "aQa", 3, {{Item("aQa", Item::kTokenType), {}}}}, - {"0x52 in token", "aRa", 3, {{Item("aRa", Item::kTokenType), {}}}}, - {"0x53 in token", "aSa", 3, {{Item("aSa", Item::kTokenType), {}}}}, - {"0x54 in token", "aTa", 3, {{Item("aTa", Item::kTokenType), {}}}}, - {"0x55 in token", "aUa", 3, {{Item("aUa", Item::kTokenType), {}}}}, - {"0x56 in token", "aVa", 3, {{Item("aVa", Item::kTokenType), {}}}}, - {"0x57 in token", "aWa", 3, {{Item("aWa", Item::kTokenType), {}}}}, - {"0x58 in token", "aXa", 3, {{Item("aXa", Item::kTokenType), {}}}}, - {"0x59 in token", "aYa", 3, {{Item("aYa", Item::kTokenType), {}}}}, - {"0x5a in token", "aZa", 3, {{Item("aZa", Item::kTokenType), {}}}}, - {"0x5b in token", "a[a", 3, absl::nullopt}, - {"0x5c in token", "a\\a", 3, absl::nullopt}, - {"0x5d in token", "a]a", 3, absl::nullopt}, - {"0x5e in token", "a^a", 3, {{Item("a^a", Item::kTokenType), {}}}}, - {"0x5f in token", "a_a", 3, {{Item("a_a", Item::kTokenType), {}}}}, - {"0x60 in token", "a`a", 3, {{Item("a`a", Item::kTokenType), {}}}}, - {"0x61 in token", "aaa", 3, {{Item("aaa", Item::kTokenType), {}}}}, - {"0x62 in token", "aba", 3, {{Item("aba", Item::kTokenType), {}}}}, - {"0x63 in token", "aca", 3, {{Item("aca", Item::kTokenType), {}}}}, - {"0x64 in token", "ada", 3, {{Item("ada", Item::kTokenType), {}}}}, - {"0x65 in token", "aea", 3, {{Item("aea", Item::kTokenType), {}}}}, - {"0x66 in token", "afa", 3, {{Item("afa", Item::kTokenType), {}}}}, - {"0x67 in token", "aga", 3, {{Item("aga", Item::kTokenType), {}}}}, - {"0x68 in token", "aha", 3, {{Item("aha", Item::kTokenType), {}}}}, - {"0x69 in token", "aia", 3, {{Item("aia", Item::kTokenType), {}}}}, - {"0x6a in token", "aja", 3, {{Item("aja", Item::kTokenType), {}}}}, - {"0x6b in token", "aka", 3, {{Item("aka", Item::kTokenType), {}}}}, - {"0x6c in token", "ala", 3, {{Item("ala", Item::kTokenType), {}}}}, - {"0x6d in token", "ama", 3, {{Item("ama", Item::kTokenType), {}}}}, - {"0x6e in token", "ana", 3, {{Item("ana", Item::kTokenType), {}}}}, - {"0x6f in token", "aoa", 3, {{Item("aoa", Item::kTokenType), {}}}}, - {"0x70 in token", "apa", 3, {{Item("apa", Item::kTokenType), {}}}}, - {"0x71 in token", "aqa", 3, {{Item("aqa", Item::kTokenType), {}}}}, - {"0x72 in token", "ara", 3, {{Item("ara", Item::kTokenType), {}}}}, - {"0x73 in token", "asa", 3, {{Item("asa", Item::kTokenType), {}}}}, - {"0x74 in token", "ata", 3, {{Item("ata", Item::kTokenType), {}}}}, - {"0x75 in token", "aua", 3, {{Item("aua", Item::kTokenType), {}}}}, - {"0x76 in token", "ava", 3, {{Item("ava", Item::kTokenType), {}}}}, - {"0x77 in token", "awa", 3, {{Item("awa", Item::kTokenType), {}}}}, - {"0x78 in token", "axa", 3, {{Item("axa", Item::kTokenType), {}}}}, - {"0x79 in token", "aya", 3, {{Item("aya", Item::kTokenType), {}}}}, - {"0x7a in token", "aza", 3, {{Item("aza", Item::kTokenType), {}}}}, - {"0x7b in token", "a{a", 3, absl::nullopt}, - {"0x7c in token", "a|a", 3, {{Item("a|a", Item::kTokenType), {}}}}, - {"0x7d in token", "a}a", 3, absl::nullopt}, - {"0x7e in token", "a~a", 3, {{Item("a~a", Item::kTokenType), {}}}}, - {"0x7f in token", "a\177a", 3, absl::nullopt}, - {"0x00 starting an token", "\000a", 2, absl::nullopt}, - {"0x01 starting an token", "\001a", 2, absl::nullopt}, - {"0x02 starting an token", "\002a", 2, absl::nullopt}, - {"0x03 starting an token", "\003a", 2, absl::nullopt}, - {"0x04 starting an token", "\004a", 2, absl::nullopt}, - {"0x05 starting an token", "\005a", 2, absl::nullopt}, - {"0x06 starting an token", "\006a", 2, absl::nullopt}, - {"0x07 starting an token", "\aa", 2, absl::nullopt}, - {"0x08 starting an token", "\ba", 2, absl::nullopt}, - {"0x09 starting an token", "\ta", 2, absl::nullopt}, - {"0x0a starting an token", "\na", 2, absl::nullopt}, - {"0x0b starting an token", "\va", 2, absl::nullopt}, - {"0x0c starting an token", "\fa", 2, absl::nullopt}, - {"0x0d starting an token", "\ra", 2, absl::nullopt}, - {"0x0e starting an token", "\016a", 2, absl::nullopt}, - {"0x0f starting an token", "\017a", 2, absl::nullopt}, - {"0x10 starting an token", "\020a", 2, absl::nullopt}, - {"0x11 starting an token", "\021a", 2, absl::nullopt}, - {"0x12 starting an token", "\022a", 2, absl::nullopt}, - {"0x13 starting an token", "\023a", 2, absl::nullopt}, - {"0x14 starting an token", "\024a", 2, absl::nullopt}, - {"0x15 starting an token", "\025a", 2, absl::nullopt}, - {"0x16 starting an token", "\026a", 2, absl::nullopt}, - {"0x17 starting an token", "\027a", 2, absl::nullopt}, - {"0x18 starting an token", "\030a", 2, absl::nullopt}, - {"0x19 starting an token", "\031a", 2, absl::nullopt}, - {"0x1a starting an token", "\032a", 2, absl::nullopt}, - {"0x1b starting an token", "\033a", 2, absl::nullopt}, - {"0x1c starting an token", "\034a", 2, absl::nullopt}, - {"0x1d starting an token", "\035a", 2, absl::nullopt}, - {"0x1e starting an token", "\036a", 2, absl::nullopt}, - {"0x1f starting an token", "\037a", 2, absl::nullopt}, - {"0x20 starting an token", - " a", - 2, - {{Item("a", Item::kTokenType), {}}}, - "a"}, - {"0x21 starting an token", "!a", 2, absl::nullopt}, - {"0x22 starting an token", "\"a", 2, absl::nullopt}, - {"0x23 starting an token", "#a", 2, absl::nullopt}, - {"0x24 starting an token", "$a", 2, absl::nullopt}, - {"0x25 starting an token", "%a", 2, absl::nullopt}, - {"0x26 starting an token", "&a", 2, absl::nullopt}, - {"0x27 starting an token", "'a", 2, absl::nullopt}, - {"0x28 starting an token", "(a", 2, absl::nullopt}, - {"0x29 starting an token", ")a", 2, absl::nullopt}, - {"0x2a starting an token", "*a", 2, {{Item("*a", Item::kTokenType), {}}}}, - {"0x2b starting an token", "+a", 2, absl::nullopt}, - {"0x2c starting an token", ",a", 2, absl::nullopt}, - {"0x2d starting an token", "-a", 2, absl::nullopt}, - {"0x2e starting an token", ".a", 2, absl::nullopt}, - {"0x2f starting an token", "/a", 2, absl::nullopt}, - {"0x30 starting an token", "0a", 2, absl::nullopt}, - {"0x31 starting an token", "1a", 2, absl::nullopt}, - {"0x32 starting an token", "2a", 2, absl::nullopt}, - {"0x33 starting an token", "3a", 2, absl::nullopt}, - {"0x34 starting an token", "4a", 2, absl::nullopt}, - {"0x35 starting an token", "5a", 2, absl::nullopt}, - {"0x36 starting an token", "6a", 2, absl::nullopt}, - {"0x37 starting an token", "7a", 2, absl::nullopt}, - {"0x38 starting an token", "8a", 2, absl::nullopt}, - {"0x39 starting an token", "9a", 2, absl::nullopt}, - {"0x3a starting an token", ":a", 2, absl::nullopt}, - {"0x3b starting an token", ";a", 2, absl::nullopt}, - {"0x3c starting an token", "<a", 2, absl::nullopt}, - {"0x3d starting an token", "=a", 2, absl::nullopt}, - {"0x3e starting an token", ">a", 2, absl::nullopt}, - {"0x3f starting an token", "?a", 2, absl::nullopt}, - {"0x40 starting an token", "@a", 2, absl::nullopt}, - {"0x41 starting an token", "Aa", 2, {{Item("Aa", Item::kTokenType), {}}}}, - {"0x42 starting an token", "Ba", 2, {{Item("Ba", Item::kTokenType), {}}}}, - {"0x43 starting an token", "Ca", 2, {{Item("Ca", Item::kTokenType), {}}}}, - {"0x44 starting an token", "Da", 2, {{Item("Da", Item::kTokenType), {}}}}, - {"0x45 starting an token", "Ea", 2, {{Item("Ea", Item::kTokenType), {}}}}, - {"0x46 starting an token", "Fa", 2, {{Item("Fa", Item::kTokenType), {}}}}, - {"0x47 starting an token", "Ga", 2, {{Item("Ga", Item::kTokenType), {}}}}, - {"0x48 starting an token", "Ha", 2, {{Item("Ha", Item::kTokenType), {}}}}, - {"0x49 starting an token", "Ia", 2, {{Item("Ia", Item::kTokenType), {}}}}, - {"0x4a starting an token", "Ja", 2, {{Item("Ja", Item::kTokenType), {}}}}, - {"0x4b starting an token", "Ka", 2, {{Item("Ka", Item::kTokenType), {}}}}, - {"0x4c starting an token", "La", 2, {{Item("La", Item::kTokenType), {}}}}, - {"0x4d starting an token", "Ma", 2, {{Item("Ma", Item::kTokenType), {}}}}, - {"0x4e starting an token", "Na", 2, {{Item("Na", Item::kTokenType), {}}}}, - {"0x4f starting an token", "Oa", 2, {{Item("Oa", Item::kTokenType), {}}}}, - {"0x50 starting an token", "Pa", 2, {{Item("Pa", Item::kTokenType), {}}}}, - {"0x51 starting an token", "Qa", 2, {{Item("Qa", Item::kTokenType), {}}}}, - {"0x52 starting an token", "Ra", 2, {{Item("Ra", Item::kTokenType), {}}}}, - {"0x53 starting an token", "Sa", 2, {{Item("Sa", Item::kTokenType), {}}}}, - {"0x54 starting an token", "Ta", 2, {{Item("Ta", Item::kTokenType), {}}}}, - {"0x55 starting an token", "Ua", 2, {{Item("Ua", Item::kTokenType), {}}}}, - {"0x56 starting an token", "Va", 2, {{Item("Va", Item::kTokenType), {}}}}, - {"0x57 starting an token", "Wa", 2, {{Item("Wa", Item::kTokenType), {}}}}, - {"0x58 starting an token", "Xa", 2, {{Item("Xa", Item::kTokenType), {}}}}, - {"0x59 starting an token", "Ya", 2, {{Item("Ya", Item::kTokenType), {}}}}, - {"0x5a starting an token", "Za", 2, {{Item("Za", Item::kTokenType), {}}}}, - {"0x5b starting an token", "[a", 2, absl::nullopt}, - {"0x5c starting an token", "\\a", 2, absl::nullopt}, - {"0x5d starting an token", "]a", 2, absl::nullopt}, - {"0x5e starting an token", "^a", 2, absl::nullopt}, - {"0x5f starting an token", "_a", 2, absl::nullopt}, - {"0x60 starting an token", "`a", 2, absl::nullopt}, - {"0x61 starting an token", "aa", 2, {{Item("aa", Item::kTokenType), {}}}}, - {"0x62 starting an token", "ba", 2, {{Item("ba", Item::kTokenType), {}}}}, - {"0x63 starting an token", "ca", 2, {{Item("ca", Item::kTokenType), {}}}}, - {"0x64 starting an token", "da", 2, {{Item("da", Item::kTokenType), {}}}}, - {"0x65 starting an token", "ea", 2, {{Item("ea", Item::kTokenType), {}}}}, - {"0x66 starting an token", "fa", 2, {{Item("fa", Item::kTokenType), {}}}}, - {"0x67 starting an token", "ga", 2, {{Item("ga", Item::kTokenType), {}}}}, - {"0x68 starting an token", "ha", 2, {{Item("ha", Item::kTokenType), {}}}}, - {"0x69 starting an token", "ia", 2, {{Item("ia", Item::kTokenType), {}}}}, - {"0x6a starting an token", "ja", 2, {{Item("ja", Item::kTokenType), {}}}}, - {"0x6b starting an token", "ka", 2, {{Item("ka", Item::kTokenType), {}}}}, - {"0x6c starting an token", "la", 2, {{Item("la", Item::kTokenType), {}}}}, - {"0x6d starting an token", "ma", 2, {{Item("ma", Item::kTokenType), {}}}}, - {"0x6e starting an token", "na", 2, {{Item("na", Item::kTokenType), {}}}}, - {"0x6f starting an token", "oa", 2, {{Item("oa", Item::kTokenType), {}}}}, - {"0x70 starting an token", "pa", 2, {{Item("pa", Item::kTokenType), {}}}}, - {"0x71 starting an token", "qa", 2, {{Item("qa", Item::kTokenType), {}}}}, - {"0x72 starting an token", "ra", 2, {{Item("ra", Item::kTokenType), {}}}}, - {"0x73 starting an token", "sa", 2, {{Item("sa", Item::kTokenType), {}}}}, - {"0x74 starting an token", "ta", 2, {{Item("ta", Item::kTokenType), {}}}}, - {"0x75 starting an token", "ua", 2, {{Item("ua", Item::kTokenType), {}}}}, - {"0x76 starting an token", "va", 2, {{Item("va", Item::kTokenType), {}}}}, - {"0x77 starting an token", "wa", 2, {{Item("wa", Item::kTokenType), {}}}}, - {"0x78 starting an token", "xa", 2, {{Item("xa", Item::kTokenType), {}}}}, - {"0x79 starting an token", "ya", 2, {{Item("ya", Item::kTokenType), {}}}}, - {"0x7a starting an token", "za", 2, {{Item("za", Item::kTokenType), {}}}}, - {"0x7b starting an token", "{a", 2, absl::nullopt}, - {"0x7c starting an token", "|a", 2, absl::nullopt}, - {"0x7d starting an token", "}a", 2, absl::nullopt}, - {"0x7e starting an token", "~a", 2, absl::nullopt}, - {"0x7f starting an token", "\177a", 2, absl::nullopt}, - // token.json - {"basic token - item", - "a_b-c.d3:f%00/*", - 15, - {{Item("a_b-c.d3:f%00/*", Item::kTokenType), {}}}}, - {"token with capitals - item", - "fooBar", - 6, - {{Item("fooBar", Item::kTokenType), {}}}}, - {"token starting with capitals - item", - "FooBar", - 6, - {{Item("FooBar", Item::kTokenType), {}}}}, -}; - -const struct ListTestCase { - const char* name; - const char* raw; - size_t raw_len; - const absl::optional<List> expected; // nullopt if parse error is expected. - const char* canonical; // nullptr if parse error is expected, or if canonical - // format is identical to raw. -} list_test_cases[] = { - - // examples.json - {"Example-StrListHeader", - "\"foo\", \"bar\", \"It was the best of times.\"", - 41, - {{{Item("foo"), {}}, - {Item("bar"), {}}, - {Item("It was the best of times."), {}}}}}, - {"Example-Hdr (list on one line)", - "foo, bar", - 8, - {{{Item("foo", Item::kTokenType), {}}, - {Item("bar", Item::kTokenType), {}}}}}, - {"Example-Hdr (list on two lines)", - "foo, bar", - 8, - {{{Item("foo", Item::kTokenType), {}}, - {Item("bar", Item::kTokenType), {}}}}, - "foo, bar"}, - {"Example-StrListListHeader", - "(\"foo\" \"bar\"), (\"baz\"), (\"bat\" \"one\"), ()", - 41, - {{{{{Item("foo"), {}}, {Item("bar"), {}}}, {}}, - {{{Item("baz"), {}}}, {}}, - {{{Item("bat"), {}}, {Item("one"), {}}}, {}}, - {std::vector<ParameterizedItem>(), {}}}}}, - {"Example-ListListParam", - "(\"foo\"; a=1;b=2);lvl=5, (\"bar\" \"baz\");lvl=1", - 43, - {{{{{Item("foo"), {Param("a", 1), Param("b", 2)}}}, {Param("lvl", 5)}}, - {{{Item("bar"), {}}, {Item("baz"), {}}}, {Param("lvl", 1)}}}}, - "(\"foo\";a=1;b=2);lvl=5, (\"bar\" \"baz\");lvl=1"}, - {"Example-ParamListHeader", - "abc;a=1;b=2; cde_456, (ghi;jk=4 l);q=\"9\";r=w", - 44, - {{{Item("abc", Item::kTokenType), - {Param("a", 1), Param("b", 2), BooleanParam("cde_456", true)}}, - {{{Item("ghi", Item::kTokenType), {Param("jk", 4)}}, - {Item("l", Item::kTokenType), {}}}, - {Param("q", "9"), TokenParam("r", "w")}}}}, - "abc;a=1;b=2;cde_456, (ghi;jk=4 l);q=\"9\";r=w"}, - // key-generated.json - {"0x00 in parameterised list key", "foo; a\000a=1", 10, absl::nullopt}, - {"0x01 in parameterised list key", "foo; a\001a=1", 10, absl::nullopt}, - {"0x02 in parameterised list key", "foo; a\002a=1", 10, absl::nullopt}, - {"0x03 in parameterised list key", "foo; a\003a=1", 10, absl::nullopt}, - {"0x04 in parameterised list key", "foo; a\004a=1", 10, absl::nullopt}, - {"0x05 in parameterised list key", "foo; a\005a=1", 10, absl::nullopt}, - {"0x06 in parameterised list key", "foo; a\006a=1", 10, absl::nullopt}, - {"0x07 in parameterised list key", "foo; a\aa=1", 10, absl::nullopt}, - {"0x08 in parameterised list key", "foo; a\ba=1", 10, absl::nullopt}, - {"0x09 in parameterised list key", "foo; a\ta=1", 10, absl::nullopt}, - {"0x0a in parameterised list key", "foo; a\na=1", 10, absl::nullopt}, - {"0x0b in parameterised list key", "foo; a\va=1", 10, absl::nullopt}, - {"0x0c in parameterised list key", "foo; a\fa=1", 10, absl::nullopt}, - {"0x0d in parameterised list key", "foo; a\ra=1", 10, absl::nullopt}, - {"0x0e in parameterised list key", "foo; a\016a=1", 10, absl::nullopt}, - {"0x0f in parameterised list key", "foo; a\017a=1", 10, absl::nullopt}, - {"0x10 in parameterised list key", "foo; a\020a=1", 10, absl::nullopt}, - {"0x11 in parameterised list key", "foo; a\021a=1", 10, absl::nullopt}, - {"0x12 in parameterised list key", "foo; a\022a=1", 10, absl::nullopt}, - {"0x13 in parameterised list key", "foo; a\023a=1", 10, absl::nullopt}, - {"0x14 in parameterised list key", "foo; a\024a=1", 10, absl::nullopt}, - {"0x15 in parameterised list key", "foo; a\025a=1", 10, absl::nullopt}, - {"0x16 in parameterised list key", "foo; a\026a=1", 10, absl::nullopt}, - {"0x17 in parameterised list key", "foo; a\027a=1", 10, absl::nullopt}, - {"0x18 in parameterised list key", "foo; a\030a=1", 10, absl::nullopt}, - {"0x19 in parameterised list key", "foo; a\031a=1", 10, absl::nullopt}, - {"0x1a in parameterised list key", "foo; a\032a=1", 10, absl::nullopt}, - {"0x1b in parameterised list key", "foo; a\033a=1", 10, absl::nullopt}, - {"0x1c in parameterised list key", "foo; a\034a=1", 10, absl::nullopt}, - {"0x1d in parameterised list key", "foo; a\035a=1", 10, absl::nullopt}, - {"0x1e in parameterised list key", "foo; a\036a=1", 10, absl::nullopt}, - {"0x1f in parameterised list key", "foo; a\037a=1", 10, absl::nullopt}, - {"0x20 in parameterised list key", "foo; a a=1", 10, absl::nullopt}, - {"0x21 in parameterised list key", "foo; a!a=1", 10, absl::nullopt}, - {"0x22 in parameterised list key", "foo; a\"a=1", 10, absl::nullopt}, - {"0x23 in parameterised list key", "foo; a#a=1", 10, absl::nullopt}, - {"0x24 in parameterised list key", "foo; a$a=1", 10, absl::nullopt}, - {"0x25 in parameterised list key", "foo; a%a=1", 10, absl::nullopt}, - {"0x26 in parameterised list key", "foo; a&a=1", 10, absl::nullopt}, - {"0x27 in parameterised list key", "foo; a'a=1", 10, absl::nullopt}, - {"0x28 in parameterised list key", "foo; a(a=1", 10, absl::nullopt}, - {"0x29 in parameterised list key", "foo; a)a=1", 10, absl::nullopt}, - {"0x2a in parameterised list key", - "foo; a*a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a*a", 1)}}}}, - "foo;a*a=1"}, - {"0x2b in parameterised list key", "foo; a+a=1", 10, absl::nullopt}, - {"0x2c in parameterised list key", "foo; a,a=1", 10, absl::nullopt}, - {"0x2d in parameterised list key", - "foo; a-a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a-a", 1)}}}}, - "foo;a-a=1"}, - {"0x2e in parameterised list key", - "foo; a.a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a.a", 1)}}}}, - "foo;a.a=1"}, - {"0x2f in parameterised list key", "foo; a/a=1", 10, absl::nullopt}, - {"0x30 in parameterised list key", - "foo; a0a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a0a", 1)}}}}, - "foo;a0a=1"}, - {"0x31 in parameterised list key", - "foo; a1a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a1a", 1)}}}}, - "foo;a1a=1"}, - {"0x32 in parameterised list key", - "foo; a2a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a2a", 1)}}}}, - "foo;a2a=1"}, - {"0x33 in parameterised list key", - "foo; a3a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a3a", 1)}}}}, - "foo;a3a=1"}, - {"0x34 in parameterised list key", - "foo; a4a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a4a", 1)}}}}, - "foo;a4a=1"}, - {"0x35 in parameterised list key", - "foo; a5a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a5a", 1)}}}}, - "foo;a5a=1"}, - {"0x36 in parameterised list key", - "foo; a6a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a6a", 1)}}}}, - "foo;a6a=1"}, - {"0x37 in parameterised list key", - "foo; a7a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a7a", 1)}}}}, - "foo;a7a=1"}, - {"0x38 in parameterised list key", - "foo; a8a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a8a", 1)}}}}, - "foo;a8a=1"}, - {"0x39 in parameterised list key", - "foo; a9a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a9a", 1)}}}}, - "foo;a9a=1"}, - {"0x3a in parameterised list key", "foo; a:a=1", 10, absl::nullopt}, - {"0x3b in parameterised list key", - "foo; a;a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a", 1)}}}}, - "foo;a=1"}, - {"0x3c in parameterised list key", "foo; a<a=1", 10, absl::nullopt}, - {"0x3d in parameterised list key", "foo; a=a=1", 10, absl::nullopt}, - {"0x3e in parameterised list key", "foo; a>a=1", 10, absl::nullopt}, - {"0x3f in parameterised list key", "foo; a?a=1", 10, absl::nullopt}, - {"0x40 in parameterised list key", "foo; a@a=1", 10, absl::nullopt}, - {"0x41 in parameterised list key", "foo; aAa=1", 10, absl::nullopt}, - {"0x42 in parameterised list key", "foo; aBa=1", 10, absl::nullopt}, - {"0x43 in parameterised list key", "foo; aCa=1", 10, absl::nullopt}, - {"0x44 in parameterised list key", "foo; aDa=1", 10, absl::nullopt}, - {"0x45 in parameterised list key", "foo; aEa=1", 10, absl::nullopt}, - {"0x46 in parameterised list key", "foo; aFa=1", 10, absl::nullopt}, - {"0x47 in parameterised list key", "foo; aGa=1", 10, absl::nullopt}, - {"0x48 in parameterised list key", "foo; aHa=1", 10, absl::nullopt}, - {"0x49 in parameterised list key", "foo; aIa=1", 10, absl::nullopt}, - {"0x4a in parameterised list key", "foo; aJa=1", 10, absl::nullopt}, - {"0x4b in parameterised list key", "foo; aKa=1", 10, absl::nullopt}, - {"0x4c in parameterised list key", "foo; aLa=1", 10, absl::nullopt}, - {"0x4d in parameterised list key", "foo; aMa=1", 10, absl::nullopt}, - {"0x4e in parameterised list key", "foo; aNa=1", 10, absl::nullopt}, - {"0x4f in parameterised list key", "foo; aOa=1", 10, absl::nullopt}, - {"0x50 in parameterised list key", "foo; aPa=1", 10, absl::nullopt}, - {"0x51 in parameterised list key", "foo; aQa=1", 10, absl::nullopt}, - {"0x52 in parameterised list key", "foo; aRa=1", 10, absl::nullopt}, - {"0x53 in parameterised list key", "foo; aSa=1", 10, absl::nullopt}, - {"0x54 in parameterised list key", "foo; aTa=1", 10, absl::nullopt}, - {"0x55 in parameterised list key", "foo; aUa=1", 10, absl::nullopt}, - {"0x56 in parameterised list key", "foo; aVa=1", 10, absl::nullopt}, - {"0x57 in parameterised list key", "foo; aWa=1", 10, absl::nullopt}, - {"0x58 in parameterised list key", "foo; aXa=1", 10, absl::nullopt}, - {"0x59 in parameterised list key", "foo; aYa=1", 10, absl::nullopt}, - {"0x5a in parameterised list key", "foo; aZa=1", 10, absl::nullopt}, - {"0x5b in parameterised list key", "foo; a[a=1", 10, absl::nullopt}, - {"0x5c in parameterised list key", "foo; a\\a=1", 10, absl::nullopt}, - {"0x5d in parameterised list key", "foo; a]a=1", 10, absl::nullopt}, - {"0x5e in parameterised list key", "foo; a^a=1", 10, absl::nullopt}, - {"0x5f in parameterised list key", - "foo; a_a=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("a_a", 1)}}}}, - "foo;a_a=1"}, - {"0x60 in parameterised list key", "foo; a`a=1", 10, absl::nullopt}, - {"0x61 in parameterised list key", - "foo; aaa=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aaa", 1)}}}}, - "foo;aaa=1"}, - {"0x62 in parameterised list key", - "foo; aba=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aba", 1)}}}}, - "foo;aba=1"}, - {"0x63 in parameterised list key", - "foo; aca=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aca", 1)}}}}, - "foo;aca=1"}, - {"0x64 in parameterised list key", - "foo; ada=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("ada", 1)}}}}, - "foo;ada=1"}, - {"0x65 in parameterised list key", - "foo; aea=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aea", 1)}}}}, - "foo;aea=1"}, - {"0x66 in parameterised list key", - "foo; afa=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("afa", 1)}}}}, - "foo;afa=1"}, - {"0x67 in parameterised list key", - "foo; aga=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aga", 1)}}}}, - "foo;aga=1"}, - {"0x68 in parameterised list key", - "foo; aha=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aha", 1)}}}}, - "foo;aha=1"}, - {"0x69 in parameterised list key", - "foo; aia=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aia", 1)}}}}, - "foo;aia=1"}, - {"0x6a in parameterised list key", - "foo; aja=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aja", 1)}}}}, - "foo;aja=1"}, - {"0x6b in parameterised list key", - "foo; aka=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aka", 1)}}}}, - "foo;aka=1"}, - {"0x6c in parameterised list key", - "foo; ala=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("ala", 1)}}}}, - "foo;ala=1"}, - {"0x6d in parameterised list key", - "foo; ama=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("ama", 1)}}}}, - "foo;ama=1"}, - {"0x6e in parameterised list key", - "foo; ana=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("ana", 1)}}}}, - "foo;ana=1"}, - {"0x6f in parameterised list key", - "foo; aoa=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aoa", 1)}}}}, - "foo;aoa=1"}, - {"0x70 in parameterised list key", - "foo; apa=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("apa", 1)}}}}, - "foo;apa=1"}, - {"0x71 in parameterised list key", - "foo; aqa=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aqa", 1)}}}}, - "foo;aqa=1"}, - {"0x72 in parameterised list key", - "foo; ara=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("ara", 1)}}}}, - "foo;ara=1"}, - {"0x73 in parameterised list key", - "foo; asa=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("asa", 1)}}}}, - "foo;asa=1"}, - {"0x74 in parameterised list key", - "foo; ata=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("ata", 1)}}}}, - "foo;ata=1"}, - {"0x75 in parameterised list key", - "foo; aua=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aua", 1)}}}}, - "foo;aua=1"}, - {"0x76 in parameterised list key", - "foo; ava=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("ava", 1)}}}}, - "foo;ava=1"}, - {"0x77 in parameterised list key", - "foo; awa=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("awa", 1)}}}}, - "foo;awa=1"}, - {"0x78 in parameterised list key", - "foo; axa=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("axa", 1)}}}}, - "foo;axa=1"}, - {"0x79 in parameterised list key", - "foo; aya=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aya", 1)}}}}, - "foo;aya=1"}, - {"0x7a in parameterised list key", - "foo; aza=1", - 10, - {{{Item("foo", Item::kTokenType), {Param("aza", 1)}}}}, - "foo;aza=1"}, - {"0x7b in parameterised list key", "foo; a{a=1", 10, absl::nullopt}, - {"0x7c in parameterised list key", "foo; a|a=1", 10, absl::nullopt}, - {"0x7d in parameterised list key", "foo; a}a=1", 10, absl::nullopt}, - {"0x7e in parameterised list key", "foo; a~a=1", 10, absl::nullopt}, - {"0x7f in parameterised list key", "foo; a\177a=1", 10, absl::nullopt}, - {"0x00 starting a parameterised list key", "foo; \000a=1", 9, - absl::nullopt}, - {"0x01 starting a parameterised list key", "foo; \001a=1", 9, - absl::nullopt}, - {"0x02 starting a parameterised list key", "foo; \002a=1", 9, - absl::nullopt}, - {"0x03 starting a parameterised list key", "foo; \003a=1", 9, - absl::nullopt}, - {"0x04 starting a parameterised list key", "foo; \004a=1", 9, - absl::nullopt}, - {"0x05 starting a parameterised list key", "foo; \005a=1", 9, - absl::nullopt}, - {"0x06 starting a parameterised list key", "foo; \006a=1", 9, - absl::nullopt}, - {"0x07 starting a parameterised list key", "foo; \aa=1", 9, absl::nullopt}, - {"0x08 starting a parameterised list key", "foo; \ba=1", 9, absl::nullopt}, - {"0x09 starting a parameterised list key", "foo; \ta=1", 9, absl::nullopt}, - {"0x0a starting a parameterised list key", "foo; \na=1", 9, absl::nullopt}, - {"0x0b starting a parameterised list key", "foo; \va=1", 9, absl::nullopt}, - {"0x0c starting a parameterised list key", "foo; \fa=1", 9, absl::nullopt}, - {"0x0d starting a parameterised list key", "foo; \ra=1", 9, absl::nullopt}, - {"0x0e starting a parameterised list key", "foo; \016a=1", 9, - absl::nullopt}, - {"0x0f starting a parameterised list key", "foo; \017a=1", 9, - absl::nullopt}, - {"0x10 starting a parameterised list key", "foo; \020a=1", 9, - absl::nullopt}, - {"0x11 starting a parameterised list key", "foo; \021a=1", 9, - absl::nullopt}, - {"0x12 starting a parameterised list key", "foo; \022a=1", 9, - absl::nullopt}, - {"0x13 starting a parameterised list key", "foo; \023a=1", 9, - absl::nullopt}, - {"0x14 starting a parameterised list key", "foo; \024a=1", 9, - absl::nullopt}, - {"0x15 starting a parameterised list key", "foo; \025a=1", 9, - absl::nullopt}, - {"0x16 starting a parameterised list key", "foo; \026a=1", 9, - absl::nullopt}, - {"0x17 starting a parameterised list key", "foo; \027a=1", 9, - absl::nullopt}, - {"0x18 starting a parameterised list key", "foo; \030a=1", 9, - absl::nullopt}, - {"0x19 starting a parameterised list key", "foo; \031a=1", 9, - absl::nullopt}, - {"0x1a starting a parameterised list key", "foo; \032a=1", 9, - absl::nullopt}, - {"0x1b starting a parameterised list key", "foo; \033a=1", 9, - absl::nullopt}, - {"0x1c starting a parameterised list key", "foo; \034a=1", 9, - absl::nullopt}, - {"0x1d starting a parameterised list key", "foo; \035a=1", 9, - absl::nullopt}, - {"0x1e starting a parameterised list key", "foo; \036a=1", 9, - absl::nullopt}, - {"0x1f starting a parameterised list key", "foo; \037a=1", 9, - absl::nullopt}, - {"0x20 starting a parameterised list key", - "foo; a=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("a", 1)}}}}, - "foo;a=1"}, - {"0x21 starting a parameterised list key", "foo; !a=1", 9, absl::nullopt}, - {"0x22 starting a parameterised list key", "foo; \"a=1", 9, absl::nullopt}, - {"0x23 starting a parameterised list key", "foo; #a=1", 9, absl::nullopt}, - {"0x24 starting a parameterised list key", "foo; $a=1", 9, absl::nullopt}, - {"0x25 starting a parameterised list key", "foo; %a=1", 9, absl::nullopt}, - {"0x26 starting a parameterised list key", "foo; &a=1", 9, absl::nullopt}, - {"0x27 starting a parameterised list key", "foo; 'a=1", 9, absl::nullopt}, - {"0x28 starting a parameterised list key", "foo; (a=1", 9, absl::nullopt}, - {"0x29 starting a parameterised list key", "foo; )a=1", 9, absl::nullopt}, - {"0x2a starting a parameterised list key", - "foo; *a=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("*a", 1)}}}}, - "foo;*a=1"}, - {"0x2b starting a parameterised list key", "foo; +a=1", 9, absl::nullopt}, - {"0x2c starting a parameterised list key", "foo; ,a=1", 9, absl::nullopt}, - {"0x2d starting a parameterised list key", "foo; -a=1", 9, absl::nullopt}, - {"0x2e starting a parameterised list key", "foo; .a=1", 9, absl::nullopt}, - {"0x2f starting a parameterised list key", "foo; /a=1", 9, absl::nullopt}, - {"0x30 starting a parameterised list key", "foo; 0a=1", 9, absl::nullopt}, - {"0x31 starting a parameterised list key", "foo; 1a=1", 9, absl::nullopt}, - {"0x32 starting a parameterised list key", "foo; 2a=1", 9, absl::nullopt}, - {"0x33 starting a parameterised list key", "foo; 3a=1", 9, absl::nullopt}, - {"0x34 starting a parameterised list key", "foo; 4a=1", 9, absl::nullopt}, - {"0x35 starting a parameterised list key", "foo; 5a=1", 9, absl::nullopt}, - {"0x36 starting a parameterised list key", "foo; 6a=1", 9, absl::nullopt}, - {"0x37 starting a parameterised list key", "foo; 7a=1", 9, absl::nullopt}, - {"0x38 starting a parameterised list key", "foo; 8a=1", 9, absl::nullopt}, - {"0x39 starting a parameterised list key", "foo; 9a=1", 9, absl::nullopt}, - {"0x3a starting a parameterised list key", "foo; :a=1", 9, absl::nullopt}, - {"0x3b starting a parameterised list key", "foo; ;a=1", 9, absl::nullopt}, - {"0x3c starting a parameterised list key", "foo; <a=1", 9, absl::nullopt}, - {"0x3d starting a parameterised list key", "foo; =a=1", 9, absl::nullopt}, - {"0x3e starting a parameterised list key", "foo; >a=1", 9, absl::nullopt}, - {"0x3f starting a parameterised list key", "foo; ?a=1", 9, absl::nullopt}, - {"0x40 starting a parameterised list key", "foo; @a=1", 9, absl::nullopt}, - {"0x41 starting a parameterised list key", "foo; Aa=1", 9, absl::nullopt}, - {"0x42 starting a parameterised list key", "foo; Ba=1", 9, absl::nullopt}, - {"0x43 starting a parameterised list key", "foo; Ca=1", 9, absl::nullopt}, - {"0x44 starting a parameterised list key", "foo; Da=1", 9, absl::nullopt}, - {"0x45 starting a parameterised list key", "foo; Ea=1", 9, absl::nullopt}, - {"0x46 starting a parameterised list key", "foo; Fa=1", 9, absl::nullopt}, - {"0x47 starting a parameterised list key", "foo; Ga=1", 9, absl::nullopt}, - {"0x48 starting a parameterised list key", "foo; Ha=1", 9, absl::nullopt}, - {"0x49 starting a parameterised list key", "foo; Ia=1", 9, absl::nullopt}, - {"0x4a starting a parameterised list key", "foo; Ja=1", 9, absl::nullopt}, - {"0x4b starting a parameterised list key", "foo; Ka=1", 9, absl::nullopt}, - {"0x4c starting a parameterised list key", "foo; La=1", 9, absl::nullopt}, - {"0x4d starting a parameterised list key", "foo; Ma=1", 9, absl::nullopt}, - {"0x4e starting a parameterised list key", "foo; Na=1", 9, absl::nullopt}, - {"0x4f starting a parameterised list key", "foo; Oa=1", 9, absl::nullopt}, - {"0x50 starting a parameterised list key", "foo; Pa=1", 9, absl::nullopt}, - {"0x51 starting a parameterised list key", "foo; Qa=1", 9, absl::nullopt}, - {"0x52 starting a parameterised list key", "foo; Ra=1", 9, absl::nullopt}, - {"0x53 starting a parameterised list key", "foo; Sa=1", 9, absl::nullopt}, - {"0x54 starting a parameterised list key", "foo; Ta=1", 9, absl::nullopt}, - {"0x55 starting a parameterised list key", "foo; Ua=1", 9, absl::nullopt}, - {"0x56 starting a parameterised list key", "foo; Va=1", 9, absl::nullopt}, - {"0x57 starting a parameterised list key", "foo; Wa=1", 9, absl::nullopt}, - {"0x58 starting a parameterised list key", "foo; Xa=1", 9, absl::nullopt}, - {"0x59 starting a parameterised list key", "foo; Ya=1", 9, absl::nullopt}, - {"0x5a starting a parameterised list key", "foo; Za=1", 9, absl::nullopt}, - {"0x5b starting a parameterised list key", "foo; [a=1", 9, absl::nullopt}, - {"0x5c starting a parameterised list key", "foo; \\a=1", 9, absl::nullopt}, - {"0x5d starting a parameterised list key", "foo; ]a=1", 9, absl::nullopt}, - {"0x5e starting a parameterised list key", "foo; ^a=1", 9, absl::nullopt}, - {"0x5f starting a parameterised list key", "foo; _a=1", 9, absl::nullopt}, - {"0x60 starting a parameterised list key", "foo; `a=1", 9, absl::nullopt}, - {"0x61 starting a parameterised list key", - "foo; aa=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("aa", 1)}}}}, - "foo;aa=1"}, - {"0x62 starting a parameterised list key", - "foo; ba=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ba", 1)}}}}, - "foo;ba=1"}, - {"0x63 starting a parameterised list key", - "foo; ca=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ca", 1)}}}}, - "foo;ca=1"}, - {"0x64 starting a parameterised list key", - "foo; da=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("da", 1)}}}}, - "foo;da=1"}, - {"0x65 starting a parameterised list key", - "foo; ea=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ea", 1)}}}}, - "foo;ea=1"}, - {"0x66 starting a parameterised list key", - "foo; fa=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("fa", 1)}}}}, - "foo;fa=1"}, - {"0x67 starting a parameterised list key", - "foo; ga=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ga", 1)}}}}, - "foo;ga=1"}, - {"0x68 starting a parameterised list key", - "foo; ha=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ha", 1)}}}}, - "foo;ha=1"}, - {"0x69 starting a parameterised list key", - "foo; ia=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ia", 1)}}}}, - "foo;ia=1"}, - {"0x6a starting a parameterised list key", - "foo; ja=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ja", 1)}}}}, - "foo;ja=1"}, - {"0x6b starting a parameterised list key", - "foo; ka=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ka", 1)}}}}, - "foo;ka=1"}, - {"0x6c starting a parameterised list key", - "foo; la=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("la", 1)}}}}, - "foo;la=1"}, - {"0x6d starting a parameterised list key", - "foo; ma=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ma", 1)}}}}, - "foo;ma=1"}, - {"0x6e starting a parameterised list key", - "foo; na=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("na", 1)}}}}, - "foo;na=1"}, - {"0x6f starting a parameterised list key", - "foo; oa=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("oa", 1)}}}}, - "foo;oa=1"}, - {"0x70 starting a parameterised list key", - "foo; pa=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("pa", 1)}}}}, - "foo;pa=1"}, - {"0x71 starting a parameterised list key", - "foo; qa=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("qa", 1)}}}}, - "foo;qa=1"}, - {"0x72 starting a parameterised list key", - "foo; ra=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ra", 1)}}}}, - "foo;ra=1"}, - {"0x73 starting a parameterised list key", - "foo; sa=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("sa", 1)}}}}, - "foo;sa=1"}, - {"0x74 starting a parameterised list key", - "foo; ta=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ta", 1)}}}}, - "foo;ta=1"}, - {"0x75 starting a parameterised list key", - "foo; ua=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ua", 1)}}}}, - "foo;ua=1"}, - {"0x76 starting a parameterised list key", - "foo; va=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("va", 1)}}}}, - "foo;va=1"}, - {"0x77 starting a parameterised list key", - "foo; wa=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("wa", 1)}}}}, - "foo;wa=1"}, - {"0x78 starting a parameterised list key", - "foo; xa=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("xa", 1)}}}}, - "foo;xa=1"}, - {"0x79 starting a parameterised list key", - "foo; ya=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("ya", 1)}}}}, - "foo;ya=1"}, - {"0x7a starting a parameterised list key", - "foo; za=1", - 9, - {{{Item("foo", Item::kTokenType), {Param("za", 1)}}}}, - "foo;za=1"}, - {"0x7b starting a parameterised list key", "foo; {a=1", 9, absl::nullopt}, - {"0x7c starting a parameterised list key", "foo; |a=1", 9, absl::nullopt}, - {"0x7d starting a parameterised list key", "foo; }a=1", 9, absl::nullopt}, - {"0x7e starting a parameterised list key", "foo; ~a=1", 9, absl::nullopt}, - {"0x7f starting a parameterised list key", "foo; \177a=1", 9, - absl::nullopt}, - // list.json - {"basic list", "1, 42", 5, {{{Integer(1), {}}, {Integer(42), {}}}}}, - {"empty list", "", 0, {List()}}, - {"leading SP list", - " 42, 43", - 8, - {{{Integer(42), {}}, {Integer(43), {}}}}, - "42, 43"}, - {"single item list", "42", 2, {{{Integer(42), {}}}}}, - {"no whitespace list", - "1,42", - 4, - {{{Integer(1), {}}, {Integer(42), {}}}}, - "1, 42"}, - {"extra whitespace list", - "1 , 42", - 6, - {{{Integer(1), {}}, {Integer(42), {}}}}, - "1, 42"}, - {"tab separated list", - "1\t,\t42", - 6, - {{{Integer(1), {}}, {Integer(42), {}}}}, - "1, 42"}, - {"two line list", - "1, 42", - 5, - {{{Integer(1), {}}, {Integer(42), {}}}}, - "1, 42"}, - {"trailing comma list", "1, 42,", 6, absl::nullopt}, - {"empty item list", "1,,42", 5, absl::nullopt}, - {"empty item list (multiple field lines)", "1, , 42", 7, absl::nullopt}, - // listlist.json - {"basic list of lists", - "(1 2), (42 43)", - 14, - {{{{{Integer(1), {}}, {Integer(2), {}}}, {}}, - {{{Integer(42), {}}, {Integer(43), {}}}, {}}}}}, - {"single item list of lists", "(42)", 4, {{{{{Integer(42), {}}}, {}}}}}, - {"empty item list of lists", - "()", - 2, - {{{std::vector<ParameterizedItem>(), {}}}}}, - {"empty middle item list of lists", - "(1),(),(42)", - 11, - {{{{{Integer(1), {}}}, {}}, - {std::vector<ParameterizedItem>(), {}}, - {{{Integer(42), {}}}, {}}}}, - "(1), (), (42)"}, - {"extra whitespace list of lists", - "( 1 42 )", - 11, - {{{{{Integer(1), {}}, {Integer(42), {}}}, {}}}}, - "(1 42)"}, - {"wrong whitespace list of lists", "(1\t 42)", 7, absl::nullopt}, - {"no trailing parenthesis list of lists", "(1 42", 5, absl::nullopt}, - {"no trailing parenthesis middle list of lists", "(1 2, (42 43)", 13, - absl::nullopt}, - {"no spaces in inner-list", "(abc\"def\"?0123*dXZ3*xyz)", 24, - absl::nullopt}, - {"no closing parenthesis", "(", 1, absl::nullopt}, - // param-list.json - {"basic parameterised list", - "abc_123;a=1;b=2; cdef_456, ghi;q=9;r=\"+w\"", - 41, - {{{Item("abc_123", Item::kTokenType), - {Param("a", 1), Param("b", 2), BooleanParam("cdef_456", true)}}, - {Item("ghi", Item::kTokenType), {Param("q", 9), Param("r", "+w")}}}}, - "abc_123;a=1;b=2;cdef_456, ghi;q=9;r=\"+w\""}, - {"single item parameterised list", - "text/html;q=1.0", - 15, - {{{Item("text/html", Item::kTokenType), {DoubleParam("q", 1.000000)}}}}}, - {"missing parameter value parameterised list", - "text/html;a;q=1.0", - 17, - {{{Item("text/html", Item::kTokenType), - {BooleanParam("a", true), DoubleParam("q", 1.000000)}}}}}, - {"missing terminal parameter value parameterised list", - "text/html;q=1.0;a", - 17, - {{{Item("text/html", Item::kTokenType), - {DoubleParam("q", 1.000000), BooleanParam("a", true)}}}}}, - {"no whitespace parameterised list", - "text/html,text/plain;q=0.5", - 26, - {{{Item("text/html", Item::kTokenType), {}}, - {Item("text/plain", Item::kTokenType), {DoubleParam("q", 0.500000)}}}}, - "text/html, text/plain;q=0.5"}, - {"whitespace before = parameterised list", "text/html, text/plain;q =0.5", - 28, absl::nullopt}, - {"whitespace after = parameterised list", "text/html, text/plain;q= 0.5", - 28, absl::nullopt}, - {"whitespace before ; parameterised list", "text/html, text/plain ;q=0.5", - 28, absl::nullopt}, - {"whitespace after ; parameterised list", - "text/html, text/plain; q=0.5", - 28, - {{{Item("text/html", Item::kTokenType), {}}, - {Item("text/plain", Item::kTokenType), {DoubleParam("q", 0.500000)}}}}, - "text/html, text/plain;q=0.5"}, - {"extra whitespace parameterised list", - "text/html , text/plain; q=0.5; charset=utf-8", - 48, - {{{Item("text/html", Item::kTokenType), {}}, - {Item("text/plain", Item::kTokenType), - {DoubleParam("q", 0.500000), TokenParam("charset", "utf-8")}}}}, - "text/html, text/plain;q=0.5;charset=utf-8"}, - {"two lines parameterised list", - "text/html, text/plain;q=0.5", - 27, - {{{Item("text/html", Item::kTokenType), {}}, - {Item("text/plain", Item::kTokenType), {DoubleParam("q", 0.500000)}}}}, - "text/html, text/plain;q=0.5"}, - {"trailing comma parameterised list", "text/html,text/plain;q=0.5,", 27, - absl::nullopt}, - {"empty item parameterised list", "text/html,,text/plain;q=0.5,", 28, - absl::nullopt}, - // param-listlist.json - {"parameterised inner list", - "(abc_123);a=1;b=2, cdef_456", - 27, - {{{{{Item("abc_123", Item::kTokenType), {}}}, - {Param("a", 1), Param("b", 2)}}, - {Item("cdef_456", Item::kTokenType), {}}}}}, - {"parameterised inner list item", - "(abc_123;a=1;b=2;cdef_456)", - 26, - {{{{{Item("abc_123", Item::kTokenType), - {Param("a", 1), Param("b", 2), BooleanParam("cdef_456", true)}}}, - {}}}}}, - {"parameterised inner list with parameterised item", - "(abc_123;a=1;b=2);cdef_456", - 26, - {{{{{Item("abc_123", Item::kTokenType), {Param("a", 1), Param("b", 2)}}}, - {BooleanParam("cdef_456", true)}}}}}, - // token.json - {"basic token - list", - "a_b-c3/*", - 8, - {{{Item("a_b-c3/*", Item::kTokenType), {}}}}}, - {"token with capitals - list", - "fooBar", - 6, - {{{Item("fooBar", Item::kTokenType), {}}}}}, - {"token starting with capitals - list", - "FooBar", - 6, - {{{Item("FooBar", Item::kTokenType), {}}}}}, -}; - -const struct DictionaryTestCase { - const char* name; - const char* raw; - size_t raw_len; - const absl::optional<Dictionary> - expected; // nullopt if parse error is expected. - const char* canonical; // nullptr if parse error is expected, or if canonical - // format is identical to raw. -} dictionary_test_cases[] = { - - // dictionary.json - {"basic dictionary", - "en=\"Applepie\", da=:w4ZibGV0w6ZydGUK:", - 36, - {Dictionary{{{"en", {Item("Applepie"), {}}}, - {"da", - {Item("\303\206blet\303\246rte\n", Item::kByteSequenceType), - {}}}}}}}, - {"empty dictionary", "", 0, {Dictionary{{}}}}, - {"single item dictionary", - "a=1", - 3, - {Dictionary{{{"a", {Integer(1), {}}}}}}}, - {"list item dictionary", - "a=(1 2)", - 7, - {Dictionary{{{"a", {{{Integer(1), {}}, {Integer(2), {}}}, {}}}}}}}, - {"single list item dictionary", - "a=(1)", - 5, - {Dictionary{{{"a", {{{Integer(1), {}}}, {}}}}}}}, - {"empty list item dictionary", - "a=()", - 4, - {Dictionary{{{"a", {std::vector<ParameterizedItem>(), {}}}}}}}, - {"no whitespace dictionary", - "a=1,b=2", - 7, - {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, - "a=1, b=2"}, - {"extra whitespace dictionary", - "a=1 , b=2", - 10, - {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, - "a=1, b=2"}, - {"tab separated dictionary", - "a=1\t,\tb=2", - 9, - {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, - "a=1, b=2"}, - {"leading whitespace dictionary", - " a=1 , b=2", - 15, - {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, - "a=1, b=2"}, - {"whitespace before = dictionary", "a =1, b=2", 9, absl::nullopt}, - {"whitespace after = dictionary", "a=1, b= 2", 9, absl::nullopt}, - {"two lines dictionary", - "a=1, b=2", - 8, - {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, - "a=1, b=2"}, - {"missing value dictionary", - "a=1, b, c=3", - 11, - {Dictionary{{{"a", {Integer(1), {}}}, - {"b", {Item(true), {}}}, - {"c", {Integer(3), {}}}}}}}, - {"all missing value dictionary", - "a, b, c", - 7, - {Dictionary{{{"a", {Item(true), {}}}, - {"b", {Item(true), {}}}, - {"c", {Item(true), {}}}}}}}, - {"start missing value dictionary", - "a, b=2", - 6, - {Dictionary{{{"a", {Item(true), {}}}, {"b", {Integer(2), {}}}}}}}, - {"end missing value dictionary", - "a=1, b", - 6, - {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Item(true), {}}}}}}}, - {"missing value with params dictionary", - "a=1, b;foo=9, c=3", - 17, - {Dictionary{{{"a", {Integer(1), {}}}, - {"b", {Item(true), {Param("foo", 9)}}}, - {"c", {Integer(3), {}}}}}}}, - {"explicit true value with params dictionary", - "a=1, b=?1;foo=9, c=3", - 20, - {Dictionary{{{"a", {Integer(1), {}}}, - {"b", {Item(true), {Param("foo", 9)}}}, - {"c", {Integer(3), {}}}}}}, - "a=1, b;foo=9, c=3"}, - {"trailing comma dictionary", "a=1, b=2,", 9, absl::nullopt}, - {"empty item dictionary", "a=1,,b=2,", 9, absl::nullopt}, - {"duplicate key dictionary", - "a=1,b=2,a=3", - 11, - {Dictionary{{{"a", {Integer(3), {}}}, {"b", {Integer(2), {}}}}}}, - "a=3, b=2"}, - {"numeric key dictionary", "a=1,1b=2,a=1", 12, absl::nullopt}, - {"uppercase key dictionary", "a=1,B=2,a=1", 11, absl::nullopt}, - {"bad key dictionary", "a=1,b!=2,a=1", 12, absl::nullopt}, - // examples.json - {"Example-DictHeader", - "en=\"Applepie\", da=:w4ZibGV0w6ZydGU=:", - 36, - {Dictionary{ - {{"en", {Item("Applepie"), {}}}, - {"da", - {Item("\303\206blet\303\246rte", Item::kByteSequenceType), {}}}}}}}, - {"Example-DictHeader", - "a=?0, b, c; foo=bar", - 19, - {Dictionary{{{"a", {Item(false), {}}}, - {"b", {Item(true), {}}}, - {"c", {Item(true), {TokenParam("foo", "bar")}}}}}}, - "a=?0, b, c;foo=bar"}, - {"Example-DictListHeader", - "rating=1.5, feelings=(joy sadness)", - 34, - {Dictionary{{{"rating", {Item(1.500000), {}}}, - {"feelings", - {{{Item("joy", Item::kTokenType), {}}, - {Item("sadness", Item::kTokenType), {}}}, - {}}}}}}}, - {"Example-MixDict", - "a=(1 2), b=3, c=4;aa=bb, d=(5 6);valid", - 38, - {Dictionary{{{"a", {{{Integer(1), {}}, {Integer(2), {}}}, {}}}, - {"b", {Integer(3), {}}}, - {"c", {Integer(4), {TokenParam("aa", "bb")}}}, - {"d", - {{{Integer(5), {}}, {Integer(6), {}}}, - {BooleanParam("valid", true)}}}}}}, - "a=(1 2), b=3, c=4;aa=bb, d=(5 6);valid"}, - {"Example-Hdr (dictionary on one line)", - "foo=1, bar=2", - 12, - {Dictionary{{{"foo", {Integer(1), {}}}, {"bar", {Integer(2), {}}}}}}}, - {"Example-Hdr (dictionary on two lines)", - "foo=1, bar=2", - 12, - {Dictionary{{{"foo", {Integer(1), {}}}, {"bar", {Integer(2), {}}}}}}, - "foo=1, bar=2"}, - // key-generated.json - {"0x00 as a single-character dictionary key", "\000=1", 3, absl::nullopt}, - {"0x01 as a single-character dictionary key", "\001=1", 3, absl::nullopt}, - {"0x02 as a single-character dictionary key", "\002=1", 3, absl::nullopt}, - {"0x03 as a single-character dictionary key", "\003=1", 3, absl::nullopt}, - {"0x04 as a single-character dictionary key", "\004=1", 3, absl::nullopt}, - {"0x05 as a single-character dictionary key", "\005=1", 3, absl::nullopt}, - {"0x06 as a single-character dictionary key", "\006=1", 3, absl::nullopt}, - {"0x07 as a single-character dictionary key", "\a=1", 3, absl::nullopt}, - {"0x08 as a single-character dictionary key", "\b=1", 3, absl::nullopt}, - {"0x09 as a single-character dictionary key", "\t=1", 3, absl::nullopt}, - {"0x0a as a single-character dictionary key", "\n=1", 3, absl::nullopt}, - {"0x0b as a single-character dictionary key", "\v=1", 3, absl::nullopt}, - {"0x0c as a single-character dictionary key", "\f=1", 3, absl::nullopt}, - {"0x0d as a single-character dictionary key", "\r=1", 3, absl::nullopt}, - {"0x0e as a single-character dictionary key", "\016=1", 3, absl::nullopt}, - {"0x0f as a single-character dictionary key", "\017=1", 3, absl::nullopt}, - {"0x10 as a single-character dictionary key", "\020=1", 3, absl::nullopt}, - {"0x11 as a single-character dictionary key", "\021=1", 3, absl::nullopt}, - {"0x12 as a single-character dictionary key", "\022=1", 3, absl::nullopt}, - {"0x13 as a single-character dictionary key", "\023=1", 3, absl::nullopt}, - {"0x14 as a single-character dictionary key", "\024=1", 3, absl::nullopt}, - {"0x15 as a single-character dictionary key", "\025=1", 3, absl::nullopt}, - {"0x16 as a single-character dictionary key", "\026=1", 3, absl::nullopt}, - {"0x17 as a single-character dictionary key", "\027=1", 3, absl::nullopt}, - {"0x18 as a single-character dictionary key", "\030=1", 3, absl::nullopt}, - {"0x19 as a single-character dictionary key", "\031=1", 3, absl::nullopt}, - {"0x1a as a single-character dictionary key", "\032=1", 3, absl::nullopt}, - {"0x1b as a single-character dictionary key", "\033=1", 3, absl::nullopt}, - {"0x1c as a single-character dictionary key", "\034=1", 3, absl::nullopt}, - {"0x1d as a single-character dictionary key", "\035=1", 3, absl::nullopt}, - {"0x1e as a single-character dictionary key", "\036=1", 3, absl::nullopt}, - {"0x1f as a single-character dictionary key", "\037=1", 3, absl::nullopt}, - {"0x20 as a single-character dictionary key", "=1", 2, absl::nullopt}, - {"0x21 as a single-character dictionary key", "!=1", 3, absl::nullopt}, - {"0x22 as a single-character dictionary key", "\"=1", 3, absl::nullopt}, - {"0x23 as a single-character dictionary key", "#=1", 3, absl::nullopt}, - {"0x24 as a single-character dictionary key", "$=1", 3, absl::nullopt}, - {"0x25 as a single-character dictionary key", "%=1", 3, absl::nullopt}, - {"0x26 as a single-character dictionary key", "&=1", 3, absl::nullopt}, - {"0x27 as a single-character dictionary key", "'=1", 3, absl::nullopt}, - {"0x28 as a single-character dictionary key", "(=1", 3, absl::nullopt}, - {"0x29 as a single-character dictionary key", ")=1", 3, absl::nullopt}, - {"0x2a as a single-character dictionary key", - "*=1", - 3, - {Dictionary{{{"*", {Integer(1), {}}}}}}}, - {"0x2b as a single-character dictionary key", "+=1", 3, absl::nullopt}, - {"0x2c as a single-character dictionary key", ",=1", 3, absl::nullopt}, - {"0x2d as a single-character dictionary key", "-=1", 3, absl::nullopt}, - {"0x2e as a single-character dictionary key", ".=1", 3, absl::nullopt}, - {"0x2f as a single-character dictionary key", "/=1", 3, absl::nullopt}, - {"0x30 as a single-character dictionary key", "0=1", 3, absl::nullopt}, - {"0x31 as a single-character dictionary key", "1=1", 3, absl::nullopt}, - {"0x32 as a single-character dictionary key", "2=1", 3, absl::nullopt}, - {"0x33 as a single-character dictionary key", "3=1", 3, absl::nullopt}, - {"0x34 as a single-character dictionary key", "4=1", 3, absl::nullopt}, - {"0x35 as a single-character dictionary key", "5=1", 3, absl::nullopt}, - {"0x36 as a single-character dictionary key", "6=1", 3, absl::nullopt}, - {"0x37 as a single-character dictionary key", "7=1", 3, absl::nullopt}, - {"0x38 as a single-character dictionary key", "8=1", 3, absl::nullopt}, - {"0x39 as a single-character dictionary key", "9=1", 3, absl::nullopt}, - {"0x3a as a single-character dictionary key", ":=1", 3, absl::nullopt}, - {"0x3b as a single-character dictionary key", ";=1", 3, absl::nullopt}, - {"0x3c as a single-character dictionary key", "<=1", 3, absl::nullopt}, - {"0x3d as a single-character dictionary key", "==1", 3, absl::nullopt}, - {"0x3e as a single-character dictionary key", ">=1", 3, absl::nullopt}, - {"0x3f as a single-character dictionary key", "?=1", 3, absl::nullopt}, - {"0x40 as a single-character dictionary key", "@=1", 3, absl::nullopt}, - {"0x41 as a single-character dictionary key", "A=1", 3, absl::nullopt}, - {"0x42 as a single-character dictionary key", "B=1", 3, absl::nullopt}, - {"0x43 as a single-character dictionary key", "C=1", 3, absl::nullopt}, - {"0x44 as a single-character dictionary key", "D=1", 3, absl::nullopt}, - {"0x45 as a single-character dictionary key", "E=1", 3, absl::nullopt}, - {"0x46 as a single-character dictionary key", "F=1", 3, absl::nullopt}, - {"0x47 as a single-character dictionary key", "G=1", 3, absl::nullopt}, - {"0x48 as a single-character dictionary key", "H=1", 3, absl::nullopt}, - {"0x49 as a single-character dictionary key", "I=1", 3, absl::nullopt}, - {"0x4a as a single-character dictionary key", "J=1", 3, absl::nullopt}, - {"0x4b as a single-character dictionary key", "K=1", 3, absl::nullopt}, - {"0x4c as a single-character dictionary key", "L=1", 3, absl::nullopt}, - {"0x4d as a single-character dictionary key", "M=1", 3, absl::nullopt}, - {"0x4e as a single-character dictionary key", "N=1", 3, absl::nullopt}, - {"0x4f as a single-character dictionary key", "O=1", 3, absl::nullopt}, - {"0x50 as a single-character dictionary key", "P=1", 3, absl::nullopt}, - {"0x51 as a single-character dictionary key", "Q=1", 3, absl::nullopt}, - {"0x52 as a single-character dictionary key", "R=1", 3, absl::nullopt}, - {"0x53 as a single-character dictionary key", "S=1", 3, absl::nullopt}, - {"0x54 as a single-character dictionary key", "T=1", 3, absl::nullopt}, - {"0x55 as a single-character dictionary key", "U=1", 3, absl::nullopt}, - {"0x56 as a single-character dictionary key", "V=1", 3, absl::nullopt}, - {"0x57 as a single-character dictionary key", "W=1", 3, absl::nullopt}, - {"0x58 as a single-character dictionary key", "X=1", 3, absl::nullopt}, - {"0x59 as a single-character dictionary key", "Y=1", 3, absl::nullopt}, - {"0x5a as a single-character dictionary key", "Z=1", 3, absl::nullopt}, - {"0x5b as a single-character dictionary key", "[=1", 3, absl::nullopt}, - {"0x5c as a single-character dictionary key", "\\=1", 3, absl::nullopt}, - {"0x5d as a single-character dictionary key", "]=1", 3, absl::nullopt}, - {"0x5e as a single-character dictionary key", "^=1", 3, absl::nullopt}, - {"0x5f as a single-character dictionary key", "_=1", 3, absl::nullopt}, - {"0x60 as a single-character dictionary key", "`=1", 3, absl::nullopt}, - {"0x61 as a single-character dictionary key", - "a=1", - 3, - {Dictionary{{{"a", {Integer(1), {}}}}}}}, - {"0x62 as a single-character dictionary key", - "b=1", - 3, - {Dictionary{{{"b", {Integer(1), {}}}}}}}, - {"0x63 as a single-character dictionary key", - "c=1", - 3, - {Dictionary{{{"c", {Integer(1), {}}}}}}}, - {"0x64 as a single-character dictionary key", - "d=1", - 3, - {Dictionary{{{"d", {Integer(1), {}}}}}}}, - {"0x65 as a single-character dictionary key", - "e=1", - 3, - {Dictionary{{{"e", {Integer(1), {}}}}}}}, - {"0x66 as a single-character dictionary key", - "f=1", - 3, - {Dictionary{{{"f", {Integer(1), {}}}}}}}, - {"0x67 as a single-character dictionary key", - "g=1", - 3, - {Dictionary{{{"g", {Integer(1), {}}}}}}}, - {"0x68 as a single-character dictionary key", - "h=1", - 3, - {Dictionary{{{"h", {Integer(1), {}}}}}}}, - {"0x69 as a single-character dictionary key", - "i=1", - 3, - {Dictionary{{{"i", {Integer(1), {}}}}}}}, - {"0x6a as a single-character dictionary key", - "j=1", - 3, - {Dictionary{{{"j", {Integer(1), {}}}}}}}, - {"0x6b as a single-character dictionary key", - "k=1", - 3, - {Dictionary{{{"k", {Integer(1), {}}}}}}}, - {"0x6c as a single-character dictionary key", - "l=1", - 3, - {Dictionary{{{"l", {Integer(1), {}}}}}}}, - {"0x6d as a single-character dictionary key", - "m=1", - 3, - {Dictionary{{{"m", {Integer(1), {}}}}}}}, - {"0x6e as a single-character dictionary key", - "n=1", - 3, - {Dictionary{{{"n", {Integer(1), {}}}}}}}, - {"0x6f as a single-character dictionary key", - "o=1", - 3, - {Dictionary{{{"o", {Integer(1), {}}}}}}}, - {"0x70 as a single-character dictionary key", - "p=1", - 3, - {Dictionary{{{"p", {Integer(1), {}}}}}}}, - {"0x71 as a single-character dictionary key", - "q=1", - 3, - {Dictionary{{{"q", {Integer(1), {}}}}}}}, - {"0x72 as a single-character dictionary key", - "r=1", - 3, - {Dictionary{{{"r", {Integer(1), {}}}}}}}, - {"0x73 as a single-character dictionary key", - "s=1", - 3, - {Dictionary{{{"s", {Integer(1), {}}}}}}}, - {"0x74 as a single-character dictionary key", - "t=1", - 3, - {Dictionary{{{"t", {Integer(1), {}}}}}}}, - {"0x75 as a single-character dictionary key", - "u=1", - 3, - {Dictionary{{{"u", {Integer(1), {}}}}}}}, - {"0x76 as a single-character dictionary key", - "v=1", - 3, - {Dictionary{{{"v", {Integer(1), {}}}}}}}, - {"0x77 as a single-character dictionary key", - "w=1", - 3, - {Dictionary{{{"w", {Integer(1), {}}}}}}}, - {"0x78 as a single-character dictionary key", - "x=1", - 3, - {Dictionary{{{"x", {Integer(1), {}}}}}}}, - {"0x79 as a single-character dictionary key", - "y=1", - 3, - {Dictionary{{{"y", {Integer(1), {}}}}}}}, - {"0x7a as a single-character dictionary key", - "z=1", - 3, - {Dictionary{{{"z", {Integer(1), {}}}}}}}, - {"0x7b as a single-character dictionary key", "{=1", 3, absl::nullopt}, - {"0x7c as a single-character dictionary key", "|=1", 3, absl::nullopt}, - {"0x7d as a single-character dictionary key", "}=1", 3, absl::nullopt}, - {"0x7e as a single-character dictionary key", "~=1", 3, absl::nullopt}, - {"0x7f as a single-character dictionary key", "\177=1", 3, absl::nullopt}, - {"0x00 in dictionary key", "a\000a=1", 5, absl::nullopt}, - {"0x01 in dictionary key", "a\001a=1", 5, absl::nullopt}, - {"0x02 in dictionary key", "a\002a=1", 5, absl::nullopt}, - {"0x03 in dictionary key", "a\003a=1", 5, absl::nullopt}, - {"0x04 in dictionary key", "a\004a=1", 5, absl::nullopt}, - {"0x05 in dictionary key", "a\005a=1", 5, absl::nullopt}, - {"0x06 in dictionary key", "a\006a=1", 5, absl::nullopt}, - {"0x07 in dictionary key", "a\aa=1", 5, absl::nullopt}, - {"0x08 in dictionary key", "a\ba=1", 5, absl::nullopt}, - {"0x09 in dictionary key", "a\ta=1", 5, absl::nullopt}, - {"0x0a in dictionary key", "a\na=1", 5, absl::nullopt}, - {"0x0b in dictionary key", "a\va=1", 5, absl::nullopt}, - {"0x0c in dictionary key", "a\fa=1", 5, absl::nullopt}, - {"0x0d in dictionary key", "a\ra=1", 5, absl::nullopt}, - {"0x0e in dictionary key", "a\016a=1", 5, absl::nullopt}, - {"0x0f in dictionary key", "a\017a=1", 5, absl::nullopt}, - {"0x10 in dictionary key", "a\020a=1", 5, absl::nullopt}, - {"0x11 in dictionary key", "a\021a=1", 5, absl::nullopt}, - {"0x12 in dictionary key", "a\022a=1", 5, absl::nullopt}, - {"0x13 in dictionary key", "a\023a=1", 5, absl::nullopt}, - {"0x14 in dictionary key", "a\024a=1", 5, absl::nullopt}, - {"0x15 in dictionary key", "a\025a=1", 5, absl::nullopt}, - {"0x16 in dictionary key", "a\026a=1", 5, absl::nullopt}, - {"0x17 in dictionary key", "a\027a=1", 5, absl::nullopt}, - {"0x18 in dictionary key", "a\030a=1", 5, absl::nullopt}, - {"0x19 in dictionary key", "a\031a=1", 5, absl::nullopt}, - {"0x1a in dictionary key", "a\032a=1", 5, absl::nullopt}, - {"0x1b in dictionary key", "a\033a=1", 5, absl::nullopt}, - {"0x1c in dictionary key", "a\034a=1", 5, absl::nullopt}, - {"0x1d in dictionary key", "a\035a=1", 5, absl::nullopt}, - {"0x1e in dictionary key", "a\036a=1", 5, absl::nullopt}, - {"0x1f in dictionary key", "a\037a=1", 5, absl::nullopt}, - {"0x20 in dictionary key", "a a=1", 5, absl::nullopt}, - {"0x21 in dictionary key", "a!a=1", 5, absl::nullopt}, - {"0x22 in dictionary key", "a\"a=1", 5, absl::nullopt}, - {"0x23 in dictionary key", "a#a=1", 5, absl::nullopt}, - {"0x24 in dictionary key", "a$a=1", 5, absl::nullopt}, - {"0x25 in dictionary key", "a%a=1", 5, absl::nullopt}, - {"0x26 in dictionary key", "a&a=1", 5, absl::nullopt}, - {"0x27 in dictionary key", "a'a=1", 5, absl::nullopt}, - {"0x28 in dictionary key", "a(a=1", 5, absl::nullopt}, - {"0x29 in dictionary key", "a)a=1", 5, absl::nullopt}, - {"0x2a in dictionary key", - "a*a=1", - 5, - {Dictionary{{{"a*a", {Integer(1), {}}}}}}}, - {"0x2b in dictionary key", "a+a=1", 5, absl::nullopt}, - {"0x2c in dictionary key", - "a,a=1", - 5, - {Dictionary{{{"a", {Integer(1), {}}}}}}, - "a=1"}, - {"0x2d in dictionary key", - "a-a=1", - 5, - {Dictionary{{{"a-a", {Integer(1), {}}}}}}}, - {"0x2e in dictionary key", - "a.a=1", - 5, - {Dictionary{{{"a.a", {Integer(1), {}}}}}}}, - {"0x2f in dictionary key", "a/a=1", 5, absl::nullopt}, - {"0x30 in dictionary key", - "a0a=1", - 5, - {Dictionary{{{"a0a", {Integer(1), {}}}}}}}, - {"0x31 in dictionary key", - "a1a=1", - 5, - {Dictionary{{{"a1a", {Integer(1), {}}}}}}}, - {"0x32 in dictionary key", - "a2a=1", - 5, - {Dictionary{{{"a2a", {Integer(1), {}}}}}}}, - {"0x33 in dictionary key", - "a3a=1", - 5, - {Dictionary{{{"a3a", {Integer(1), {}}}}}}}, - {"0x34 in dictionary key", - "a4a=1", - 5, - {Dictionary{{{"a4a", {Integer(1), {}}}}}}}, - {"0x35 in dictionary key", - "a5a=1", - 5, - {Dictionary{{{"a5a", {Integer(1), {}}}}}}}, - {"0x36 in dictionary key", - "a6a=1", - 5, - {Dictionary{{{"a6a", {Integer(1), {}}}}}}}, - {"0x37 in dictionary key", - "a7a=1", - 5, - {Dictionary{{{"a7a", {Integer(1), {}}}}}}}, - {"0x38 in dictionary key", - "a8a=1", - 5, - {Dictionary{{{"a8a", {Integer(1), {}}}}}}}, - {"0x39 in dictionary key", - "a9a=1", - 5, - {Dictionary{{{"a9a", {Integer(1), {}}}}}}}, - {"0x3a in dictionary key", "a:a=1", 5, absl::nullopt}, - {"0x3b in dictionary key", - "a;a=1", - 5, - {Dictionary{{{"a", {Item(true), {Param("a", 1)}}}}}}}, - {"0x3c in dictionary key", "a<a=1", 5, absl::nullopt}, - {"0x3d in dictionary key", "a=a=1", 5, absl::nullopt}, - {"0x3e in dictionary key", "a>a=1", 5, absl::nullopt}, - {"0x3f in dictionary key", "a?a=1", 5, absl::nullopt}, - {"0x40 in dictionary key", "a@a=1", 5, absl::nullopt}, - {"0x41 in dictionary key", "aAa=1", 5, absl::nullopt}, - {"0x42 in dictionary key", "aBa=1", 5, absl::nullopt}, - {"0x43 in dictionary key", "aCa=1", 5, absl::nullopt}, - {"0x44 in dictionary key", "aDa=1", 5, absl::nullopt}, - {"0x45 in dictionary key", "aEa=1", 5, absl::nullopt}, - {"0x46 in dictionary key", "aFa=1", 5, absl::nullopt}, - {"0x47 in dictionary key", "aGa=1", 5, absl::nullopt}, - {"0x48 in dictionary key", "aHa=1", 5, absl::nullopt}, - {"0x49 in dictionary key", "aIa=1", 5, absl::nullopt}, - {"0x4a in dictionary key", "aJa=1", 5, absl::nullopt}, - {"0x4b in dictionary key", "aKa=1", 5, absl::nullopt}, - {"0x4c in dictionary key", "aLa=1", 5, absl::nullopt}, - {"0x4d in dictionary key", "aMa=1", 5, absl::nullopt}, - {"0x4e in dictionary key", "aNa=1", 5, absl::nullopt}, - {"0x4f in dictionary key", "aOa=1", 5, absl::nullopt}, - {"0x50 in dictionary key", "aPa=1", 5, absl::nullopt}, - {"0x51 in dictionary key", "aQa=1", 5, absl::nullopt}, - {"0x52 in dictionary key", "aRa=1", 5, absl::nullopt}, - {"0x53 in dictionary key", "aSa=1", 5, absl::nullopt}, - {"0x54 in dictionary key", "aTa=1", 5, absl::nullopt}, - {"0x55 in dictionary key", "aUa=1", 5, absl::nullopt}, - {"0x56 in dictionary key", "aVa=1", 5, absl::nullopt}, - {"0x57 in dictionary key", "aWa=1", 5, absl::nullopt}, - {"0x58 in dictionary key", "aXa=1", 5, absl::nullopt}, - {"0x59 in dictionary key", "aYa=1", 5, absl::nullopt}, - {"0x5a in dictionary key", "aZa=1", 5, absl::nullopt}, - {"0x5b in dictionary key", "a[a=1", 5, absl::nullopt}, - {"0x5c in dictionary key", "a\\a=1", 5, absl::nullopt}, - {"0x5d in dictionary key", "a]a=1", 5, absl::nullopt}, - {"0x5e in dictionary key", "a^a=1", 5, absl::nullopt}, - {"0x5f in dictionary key", - "a_a=1", - 5, - {Dictionary{{{"a_a", {Integer(1), {}}}}}}}, - {"0x60 in dictionary key", "a`a=1", 5, absl::nullopt}, - {"0x61 in dictionary key", - "aaa=1", - 5, - {Dictionary{{{"aaa", {Integer(1), {}}}}}}}, - {"0x62 in dictionary key", - "aba=1", - 5, - {Dictionary{{{"aba", {Integer(1), {}}}}}}}, - {"0x63 in dictionary key", - "aca=1", - 5, - {Dictionary{{{"aca", {Integer(1), {}}}}}}}, - {"0x64 in dictionary key", - "ada=1", - 5, - {Dictionary{{{"ada", {Integer(1), {}}}}}}}, - {"0x65 in dictionary key", - "aea=1", - 5, - {Dictionary{{{"aea", {Integer(1), {}}}}}}}, - {"0x66 in dictionary key", - "afa=1", - 5, - {Dictionary{{{"afa", {Integer(1), {}}}}}}}, - {"0x67 in dictionary key", - "aga=1", - 5, - {Dictionary{{{"aga", {Integer(1), {}}}}}}}, - {"0x68 in dictionary key", - "aha=1", - 5, - {Dictionary{{{"aha", {Integer(1), {}}}}}}}, - {"0x69 in dictionary key", - "aia=1", - 5, - {Dictionary{{{"aia", {Integer(1), {}}}}}}}, - {"0x6a in dictionary key", - "aja=1", - 5, - {Dictionary{{{"aja", {Integer(1), {}}}}}}}, - {"0x6b in dictionary key", - "aka=1", - 5, - {Dictionary{{{"aka", {Integer(1), {}}}}}}}, - {"0x6c in dictionary key", - "ala=1", - 5, - {Dictionary{{{"ala", {Integer(1), {}}}}}}}, - {"0x6d in dictionary key", - "ama=1", - 5, - {Dictionary{{{"ama", {Integer(1), {}}}}}}}, - {"0x6e in dictionary key", - "ana=1", - 5, - {Dictionary{{{"ana", {Integer(1), {}}}}}}}, - {"0x6f in dictionary key", - "aoa=1", - 5, - {Dictionary{{{"aoa", {Integer(1), {}}}}}}}, - {"0x70 in dictionary key", - "apa=1", - 5, - {Dictionary{{{"apa", {Integer(1), {}}}}}}}, - {"0x71 in dictionary key", - "aqa=1", - 5, - {Dictionary{{{"aqa", {Integer(1), {}}}}}}}, - {"0x72 in dictionary key", - "ara=1", - 5, - {Dictionary{{{"ara", {Integer(1), {}}}}}}}, - {"0x73 in dictionary key", - "asa=1", - 5, - {Dictionary{{{"asa", {Integer(1), {}}}}}}}, - {"0x74 in dictionary key", - "ata=1", - 5, - {Dictionary{{{"ata", {Integer(1), {}}}}}}}, - {"0x75 in dictionary key", - "aua=1", - 5, - {Dictionary{{{"aua", {Integer(1), {}}}}}}}, - {"0x76 in dictionary key", - "ava=1", - 5, - {Dictionary{{{"ava", {Integer(1), {}}}}}}}, - {"0x77 in dictionary key", - "awa=1", - 5, - {Dictionary{{{"awa", {Integer(1), {}}}}}}}, - {"0x78 in dictionary key", - "axa=1", - 5, - {Dictionary{{{"axa", {Integer(1), {}}}}}}}, - {"0x79 in dictionary key", - "aya=1", - 5, - {Dictionary{{{"aya", {Integer(1), {}}}}}}}, - {"0x7a in dictionary key", - "aza=1", - 5, - {Dictionary{{{"aza", {Integer(1), {}}}}}}}, - {"0x7b in dictionary key", "a{a=1", 5, absl::nullopt}, - {"0x7c in dictionary key", "a|a=1", 5, absl::nullopt}, - {"0x7d in dictionary key", "a}a=1", 5, absl::nullopt}, - {"0x7e in dictionary key", "a~a=1", 5, absl::nullopt}, - {"0x7f in dictionary key", "a\177a=1", 5, absl::nullopt}, - {"0x00 starting an dictionary key", "\000a=1", 4, absl::nullopt}, - {"0x01 starting an dictionary key", "\001a=1", 4, absl::nullopt}, - {"0x02 starting an dictionary key", "\002a=1", 4, absl::nullopt}, - {"0x03 starting an dictionary key", "\003a=1", 4, absl::nullopt}, - {"0x04 starting an dictionary key", "\004a=1", 4, absl::nullopt}, - {"0x05 starting an dictionary key", "\005a=1", 4, absl::nullopt}, - {"0x06 starting an dictionary key", "\006a=1", 4, absl::nullopt}, - {"0x07 starting an dictionary key", "\aa=1", 4, absl::nullopt}, - {"0x08 starting an dictionary key", "\ba=1", 4, absl::nullopt}, - {"0x09 starting an dictionary key", "\ta=1", 4, absl::nullopt}, - {"0x0a starting an dictionary key", "\na=1", 4, absl::nullopt}, - {"0x0b starting an dictionary key", "\va=1", 4, absl::nullopt}, - {"0x0c starting an dictionary key", "\fa=1", 4, absl::nullopt}, - {"0x0d starting an dictionary key", "\ra=1", 4, absl::nullopt}, - {"0x0e starting an dictionary key", "\016a=1", 4, absl::nullopt}, - {"0x0f starting an dictionary key", "\017a=1", 4, absl::nullopt}, - {"0x10 starting an dictionary key", "\020a=1", 4, absl::nullopt}, - {"0x11 starting an dictionary key", "\021a=1", 4, absl::nullopt}, - {"0x12 starting an dictionary key", "\022a=1", 4, absl::nullopt}, - {"0x13 starting an dictionary key", "\023a=1", 4, absl::nullopt}, - {"0x14 starting an dictionary key", "\024a=1", 4, absl::nullopt}, - {"0x15 starting an dictionary key", "\025a=1", 4, absl::nullopt}, - {"0x16 starting an dictionary key", "\026a=1", 4, absl::nullopt}, - {"0x17 starting an dictionary key", "\027a=1", 4, absl::nullopt}, - {"0x18 starting an dictionary key", "\030a=1", 4, absl::nullopt}, - {"0x19 starting an dictionary key", "\031a=1", 4, absl::nullopt}, - {"0x1a starting an dictionary key", "\032a=1", 4, absl::nullopt}, - {"0x1b starting an dictionary key", "\033a=1", 4, absl::nullopt}, - {"0x1c starting an dictionary key", "\034a=1", 4, absl::nullopt}, - {"0x1d starting an dictionary key", "\035a=1", 4, absl::nullopt}, - {"0x1e starting an dictionary key", "\036a=1", 4, absl::nullopt}, - {"0x1f starting an dictionary key", "\037a=1", 4, absl::nullopt}, - {"0x20 starting an dictionary key", - " a=1", - 4, - {Dictionary{{{"a", {Integer(1), {}}}}}}, - "a=1"}, - {"0x21 starting an dictionary key", "!a=1", 4, absl::nullopt}, - {"0x22 starting an dictionary key", "\"a=1", 4, absl::nullopt}, - {"0x23 starting an dictionary key", "#a=1", 4, absl::nullopt}, - {"0x24 starting an dictionary key", "$a=1", 4, absl::nullopt}, - {"0x25 starting an dictionary key", "%a=1", 4, absl::nullopt}, - {"0x26 starting an dictionary key", "&a=1", 4, absl::nullopt}, - {"0x27 starting an dictionary key", "'a=1", 4, absl::nullopt}, - {"0x28 starting an dictionary key", "(a=1", 4, absl::nullopt}, - {"0x29 starting an dictionary key", ")a=1", 4, absl::nullopt}, - {"0x2a starting an dictionary key", - "*a=1", - 4, - {Dictionary{{{"*a", {Integer(1), {}}}}}}}, - {"0x2b starting an dictionary key", "+a=1", 4, absl::nullopt}, - {"0x2c starting an dictionary key", ",a=1", 4, absl::nullopt}, - {"0x2d starting an dictionary key", "-a=1", 4, absl::nullopt}, - {"0x2e starting an dictionary key", ".a=1", 4, absl::nullopt}, - {"0x2f starting an dictionary key", "/a=1", 4, absl::nullopt}, - {"0x30 starting an dictionary key", "0a=1", 4, absl::nullopt}, - {"0x31 starting an dictionary key", "1a=1", 4, absl::nullopt}, - {"0x32 starting an dictionary key", "2a=1", 4, absl::nullopt}, - {"0x33 starting an dictionary key", "3a=1", 4, absl::nullopt}, - {"0x34 starting an dictionary key", "4a=1", 4, absl::nullopt}, - {"0x35 starting an dictionary key", "5a=1", 4, absl::nullopt}, - {"0x36 starting an dictionary key", "6a=1", 4, absl::nullopt}, - {"0x37 starting an dictionary key", "7a=1", 4, absl::nullopt}, - {"0x38 starting an dictionary key", "8a=1", 4, absl::nullopt}, - {"0x39 starting an dictionary key", "9a=1", 4, absl::nullopt}, - {"0x3a starting an dictionary key", ":a=1", 4, absl::nullopt}, - {"0x3b starting an dictionary key", ";a=1", 4, absl::nullopt}, - {"0x3c starting an dictionary key", "<a=1", 4, absl::nullopt}, - {"0x3d starting an dictionary key", "=a=1", 4, absl::nullopt}, - {"0x3e starting an dictionary key", ">a=1", 4, absl::nullopt}, - {"0x3f starting an dictionary key", "?a=1", 4, absl::nullopt}, - {"0x40 starting an dictionary key", "@a=1", 4, absl::nullopt}, - {"0x41 starting an dictionary key", "Aa=1", 4, absl::nullopt}, - {"0x42 starting an dictionary key", "Ba=1", 4, absl::nullopt}, - {"0x43 starting an dictionary key", "Ca=1", 4, absl::nullopt}, - {"0x44 starting an dictionary key", "Da=1", 4, absl::nullopt}, - {"0x45 starting an dictionary key", "Ea=1", 4, absl::nullopt}, - {"0x46 starting an dictionary key", "Fa=1", 4, absl::nullopt}, - {"0x47 starting an dictionary key", "Ga=1", 4, absl::nullopt}, - {"0x48 starting an dictionary key", "Ha=1", 4, absl::nullopt}, - {"0x49 starting an dictionary key", "Ia=1", 4, absl::nullopt}, - {"0x4a starting an dictionary key", "Ja=1", 4, absl::nullopt}, - {"0x4b starting an dictionary key", "Ka=1", 4, absl::nullopt}, - {"0x4c starting an dictionary key", "La=1", 4, absl::nullopt}, - {"0x4d starting an dictionary key", "Ma=1", 4, absl::nullopt}, - {"0x4e starting an dictionary key", "Na=1", 4, absl::nullopt}, - {"0x4f starting an dictionary key", "Oa=1", 4, absl::nullopt}, - {"0x50 starting an dictionary key", "Pa=1", 4, absl::nullopt}, - {"0x51 starting an dictionary key", "Qa=1", 4, absl::nullopt}, - {"0x52 starting an dictionary key", "Ra=1", 4, absl::nullopt}, - {"0x53 starting an dictionary key", "Sa=1", 4, absl::nullopt}, - {"0x54 starting an dictionary key", "Ta=1", 4, absl::nullopt}, - {"0x55 starting an dictionary key", "Ua=1", 4, absl::nullopt}, - {"0x56 starting an dictionary key", "Va=1", 4, absl::nullopt}, - {"0x57 starting an dictionary key", "Wa=1", 4, absl::nullopt}, - {"0x58 starting an dictionary key", "Xa=1", 4, absl::nullopt}, - {"0x59 starting an dictionary key", "Ya=1", 4, absl::nullopt}, - {"0x5a starting an dictionary key", "Za=1", 4, absl::nullopt}, - {"0x5b starting an dictionary key", "[a=1", 4, absl::nullopt}, - {"0x5c starting an dictionary key", "\\a=1", 4, absl::nullopt}, - {"0x5d starting an dictionary key", "]a=1", 4, absl::nullopt}, - {"0x5e starting an dictionary key", "^a=1", 4, absl::nullopt}, - {"0x5f starting an dictionary key", "_a=1", 4, absl::nullopt}, - {"0x60 starting an dictionary key", "`a=1", 4, absl::nullopt}, - {"0x61 starting an dictionary key", - "aa=1", - 4, - {Dictionary{{{"aa", {Integer(1), {}}}}}}}, - {"0x62 starting an dictionary key", - "ba=1", - 4, - {Dictionary{{{"ba", {Integer(1), {}}}}}}}, - {"0x63 starting an dictionary key", - "ca=1", - 4, - {Dictionary{{{"ca", {Integer(1), {}}}}}}}, - {"0x64 starting an dictionary key", - "da=1", - 4, - {Dictionary{{{"da", {Integer(1), {}}}}}}}, - {"0x65 starting an dictionary key", - "ea=1", - 4, - {Dictionary{{{"ea", {Integer(1), {}}}}}}}, - {"0x66 starting an dictionary key", - "fa=1", - 4, - {Dictionary{{{"fa", {Integer(1), {}}}}}}}, - {"0x67 starting an dictionary key", - "ga=1", - 4, - {Dictionary{{{"ga", {Integer(1), {}}}}}}}, - {"0x68 starting an dictionary key", - "ha=1", - 4, - {Dictionary{{{"ha", {Integer(1), {}}}}}}}, - {"0x69 starting an dictionary key", - "ia=1", - 4, - {Dictionary{{{"ia", {Integer(1), {}}}}}}}, - {"0x6a starting an dictionary key", - "ja=1", - 4, - {Dictionary{{{"ja", {Integer(1), {}}}}}}}, - {"0x6b starting an dictionary key", - "ka=1", - 4, - {Dictionary{{{"ka", {Integer(1), {}}}}}}}, - {"0x6c starting an dictionary key", - "la=1", - 4, - {Dictionary{{{"la", {Integer(1), {}}}}}}}, - {"0x6d starting an dictionary key", - "ma=1", - 4, - {Dictionary{{{"ma", {Integer(1), {}}}}}}}, - {"0x6e starting an dictionary key", - "na=1", - 4, - {Dictionary{{{"na", {Integer(1), {}}}}}}}, - {"0x6f starting an dictionary key", - "oa=1", - 4, - {Dictionary{{{"oa", {Integer(1), {}}}}}}}, - {"0x70 starting an dictionary key", - "pa=1", - 4, - {Dictionary{{{"pa", {Integer(1), {}}}}}}}, - {"0x71 starting an dictionary key", - "qa=1", - 4, - {Dictionary{{{"qa", {Integer(1), {}}}}}}}, - {"0x72 starting an dictionary key", - "ra=1", - 4, - {Dictionary{{{"ra", {Integer(1), {}}}}}}}, - {"0x73 starting an dictionary key", - "sa=1", - 4, - {Dictionary{{{"sa", {Integer(1), {}}}}}}}, - {"0x74 starting an dictionary key", - "ta=1", - 4, - {Dictionary{{{"ta", {Integer(1), {}}}}}}}, - {"0x75 starting an dictionary key", - "ua=1", - 4, - {Dictionary{{{"ua", {Integer(1), {}}}}}}}, - {"0x76 starting an dictionary key", - "va=1", - 4, - {Dictionary{{{"va", {Integer(1), {}}}}}}}, - {"0x77 starting an dictionary key", - "wa=1", - 4, - {Dictionary{{{"wa", {Integer(1), {}}}}}}}, - {"0x78 starting an dictionary key", - "xa=1", - 4, - {Dictionary{{{"xa", {Integer(1), {}}}}}}}, - {"0x79 starting an dictionary key", - "ya=1", - 4, - {Dictionary{{{"ya", {Integer(1), {}}}}}}}, - {"0x7a starting an dictionary key", - "za=1", - 4, - {Dictionary{{{"za", {Integer(1), {}}}}}}}, - {"0x7b starting an dictionary key", "{a=1", 4, absl::nullopt}, - {"0x7c starting an dictionary key", "|a=1", 4, absl::nullopt}, - {"0x7d starting an dictionary key", "}a=1", 4, absl::nullopt}, - {"0x7e starting an dictionary key", "~a=1", 4, absl::nullopt}, - {"0x7f starting an dictionary key", "\177a=1", 4, absl::nullopt}, - // param-dict.json - {"basic parameterised dict", - "abc=123;a=1;b=2, def=456, ghi=789;q=9;r=\"+w\"", - 44, - {Dictionary{ - {{"abc", {Integer(123), {Param("a", 1), Param("b", 2)}}}, - {"def", {Integer(456), {}}}, - {"ghi", {Integer(789), {Param("q", 9), Param("r", "+w")}}}}}}}, - {"single item parameterised dict", - "a=b; q=1.0", - 10, - {Dictionary{ - {{"a", {Item("b", Item::kTokenType), {DoubleParam("q", 1.000000)}}}}}}, - "a=b;q=1.0"}, - {"list item parameterised dictionary", - "a=(1 2); q=1.0", - 14, - {Dictionary{{{"a", - {{{Integer(1), {}}, {Integer(2), {}}}, - {DoubleParam("q", 1.000000)}}}}}}, - "a=(1 2);q=1.0"}, - {"missing parameter value parameterised dict", - "a=3;c;d=5", - 9, - {Dictionary{ - {{"a", {Integer(3), {BooleanParam("c", true), Param("d", 5)}}}}}}}, - {"terminal missing parameter value parameterised dict", - "a=3;c=5;d", - 9, - {Dictionary{ - {{"a", {Integer(3), {Param("c", 5), BooleanParam("d", true)}}}}}}}, - {"no whitespace parameterised dict", - "a=b;c=1,d=e;f=2", - 15, - {Dictionary{{{"a", {Item("b", Item::kTokenType), {Param("c", 1)}}}, - {"d", {Item("e", Item::kTokenType), {Param("f", 2)}}}}}}, - "a=b;c=1, d=e;f=2"}, - {"whitespace before = parameterised dict", "a=b;q =0.5", 10, absl::nullopt}, - {"whitespace after = parameterised dict", "a=b;q= 0.5", 10, absl::nullopt}, - {"whitespace before ; parameterised dict", "a=b ;q=0.5", 10, absl::nullopt}, - {"whitespace after ; parameterised dict", - "a=b; q=0.5", - 10, - {Dictionary{ - {{"a", {Item("b", Item::kTokenType), {DoubleParam("q", 0.500000)}}}}}}, - "a=b;q=0.5"}, - {"extra whitespace parameterised dict", - "a=b; c=1 , d=e; f=2; g=3", - 27, - {Dictionary{ - {{"a", {Item("b", Item::kTokenType), {Param("c", 1)}}}, - {"d", - {Item("e", Item::kTokenType), {Param("f", 2), Param("g", 3)}}}}}}, - "a=b;c=1, d=e;f=2;g=3"}, - {"two lines parameterised list", - "a=b;c=1, d=e;f=2", - 16, - {Dictionary{{{"a", {Item("b", Item::kTokenType), {Param("c", 1)}}}, - {"d", {Item("e", Item::kTokenType), {Param("f", 2)}}}}}}, - "a=b;c=1, d=e;f=2"}, - {"trailing comma parameterised list", "a=b; q=1.0,", 11, absl::nullopt}, - {"empty item parameterised list", "a=b; q=1.0,,c=d", 15, absl::nullopt}, -}; -} // namespace - -TEST(StructuredHeaderGeneratedTest, ParseItem) { - for (const auto& c : parameterized_item_test_cases) { - if (c.raw) { - SCOPED_TRACE(c.name); - std::string raw{c.raw, c.raw_len}; - absl::optional<ParameterizedItem> result = ParseItem(raw); - EXPECT_EQ(result, c.expected); - } - } -} - -TEST(StructuredHeaderGeneratedTest, ParseList) { - for (const auto& c : list_test_cases) { - if (c.raw) { - SCOPED_TRACE(c.name); - std::string raw{c.raw, c.raw_len}; - absl::optional<List> result = ParseList(raw); - EXPECT_EQ(result, c.expected); - } - } -} - -TEST(StructuredHeaderGeneratedTest, ParseDictionary) { - for (const auto& c : dictionary_test_cases) { - if (c.raw) { - SCOPED_TRACE(c.name); - std::string raw{c.raw, c.raw_len}; - absl::optional<Dictionary> result = ParseDictionary(raw); - EXPECT_EQ(result, c.expected); - } - } -} - -TEST(StructuredHeaderGeneratedTest, SerializeItem) { - for (const auto& c : parameterized_item_test_cases) { - SCOPED_TRACE(c.name); - if (c.expected) { - absl::optional<std::string> result = SerializeItem(*c.expected); - if (c.raw || c.canonical) { - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result.value(), - std::string(c.canonical ? c.canonical : c.raw)); - } else { - EXPECT_FALSE(result.has_value()); - } - } - } -} - -TEST(StructuredHeaderGeneratedTest, SerializeList) { - for (const auto& c : list_test_cases) { - SCOPED_TRACE(c.name); - if (c.expected) { - absl::optional<std::string> result = SerializeList(*c.expected); - if (c.raw || c.canonical) { - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result.value(), - std::string(c.canonical ? c.canonical : c.raw)); - } else { - EXPECT_FALSE(result.has_value()); - } - } - } -} - -TEST(StructuredHeaderGeneratedTest, SerializeDictionary) { - for (const auto& c : dictionary_test_cases) { - SCOPED_TRACE(c.name); - if (c.expected) { - absl::optional<std::string> result = SerializeDictionary(*c.expected); - if (c.raw || c.canonical) { - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result.value(), - std::string(c.canonical ? c.canonical : c.raw)); - } else { - EXPECT_FALSE(result.has_value()); - } - } - } -} - -} // namespace structured_headers -} // namespace net
diff --git a/net/http/structured_headers_unittest.cc b/net/http/structured_headers_unittest.cc deleted file mode 100644 index d2848b2b..0000000 --- a/net/http/structured_headers_unittest.cc +++ /dev/null
@@ -1,748 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/http/structured_headers.h" - -#include <math.h> - -#include <limits> -#include <string> - -#include "testing/gtest/include/gtest/gtest.h" - -namespace net { -namespace structured_headers { -namespace { - -// Helpers to make test cases clearer - -Item Token(std::string value) { - return Item(value, Item::kTokenType); -} - -Item Integer(int64_t value) { - return Item(value); -} - -// Parameter with null value, only used in Structured Headers Draft 09 -std::pair<std::string, Item> NullParam(std::string key) { - return std::make_pair(key, Item()); -} - -std::pair<std::string, Item> BooleanParam(std::string key, bool value) { - return std::make_pair(key, Item(value)); -} - -std::pair<std::string, Item> DoubleParam(std::string key, double value) { - return std::make_pair(key, Item(value)); -} - -std::pair<std::string, Item> Param(std::string key, int64_t value) { - return std::make_pair(key, Item(value)); -} - -std::pair<std::string, Item> Param(std::string key, std::string value) { - return std::make_pair(key, Item(value)); -} - -std::pair<std::string, Item> ByteSequenceParam(std::string key, - std::string value) { - return std::make_pair(key, Item(value, Item::kByteSequenceType)); -} - -std::pair<std::string, Item> TokenParam(std::string key, std::string value) { - return std::make_pair(key, Token(value)); -} - -// Test cases taken from https://github.com/httpwg/structured-header-tests can -// be found in structured_headers_generated_unittest.cc - -const struct ItemTestCase { - const char* name; - const char* raw; - const absl::optional<Item> expected; // nullopt if parse error is expected. - const char* canonical; // nullptr if parse error is expected, or if canonical - // format is identical to raw. -} item_test_cases[] = { - // Token - {"bad token - item", "abc$@%!", absl::nullopt}, - {"leading whitespace", " foo", Token("foo"), "foo"}, - {"trailing whitespace", "foo ", Token("foo"), "foo"}, - {"leading asterisk", "*foo", Token("*foo")}, - // Number - {"long integer", "999999999999999", Integer(999999999999999L)}, - {"long negative integer", "-999999999999999", Integer(-999999999999999L)}, - {"too long integer", "1000000000000000", absl::nullopt}, - {"negative too long integer", "-1000000000000000", absl::nullopt}, - {"integral decimal", "1.0", Item(1.0)}, - // String - {"basic string", "\"foo\"", Item("foo")}, - {"non-ascii string", "\"f\xC3\xBC\xC3\xBC\"", absl::nullopt}, - // Additional tests - {"valid quoting containing \\n", "\"\\\\n\"", Item("\\n")}, - {"valid quoting containing \\t", "\"\\\\t\"", Item("\\t")}, - {"valid quoting containing \\x", "\"\\\\x61\"", Item("\\x61")}, - {"c-style hex escape in string", "\"\\x61\"", absl::nullopt}, - {"valid quoting containing \\u", "\"\\\\u0061\"", Item("\\u0061")}, - {"c-style unicode escape in string", "\"\\u0061\"", absl::nullopt}, -}; - -const ItemTestCase sh09_item_test_cases[] = { - // Integer - {"large integer", "9223372036854775807", Integer(9223372036854775807L)}, - {"large negative integer", "-9223372036854775807", - Integer(-9223372036854775807L)}, - {"too large integer", "9223372036854775808", absl::nullopt}, - {"too large negative integer", "-9223372036854775808", absl::nullopt}, - // Byte Sequence - {"basic binary", "*aGVsbG8=*", Item("hello", Item::kByteSequenceType)}, - {"empty binary", "**", Item("", Item::kByteSequenceType)}, - {"bad paddding", "*aGVsbG8*", Item("hello", Item::kByteSequenceType), - "*aGVsbG8=*"}, - {"bad end delimiter", "*aGVsbG8=", absl::nullopt}, - {"extra whitespace", "*aGVsb G8=*", absl::nullopt}, - {"extra chars", "*aGVsbG!8=*", absl::nullopt}, - {"suffix chars", "*aGVsbG8=!*", absl::nullopt}, - {"non-zero pad bits", "*iZ==*", Item("\x89", Item::kByteSequenceType), - "*iQ==*"}, - {"non-ASCII binary", "*/+Ah*", Item("\xFF\xE0!", Item::kByteSequenceType)}, - {"base64url binary", "*_-Ah*", absl::nullopt}, - {"token with leading asterisk", "*foo", absl::nullopt}, -}; - -// For Structured Headers Draft 15 -const struct ParameterizedItemTestCase { - const char* name; - const char* raw; - const absl::optional<ParameterizedItem> - expected; // nullopt if parse error is expected. - const char* canonical; // nullptr if parse error is expected, or if canonical - // format is identical to raw. -} parameterized_item_test_cases[] = { - {"single parameter item", - "text/html;q=1.0", - {{Token("text/html"), {DoubleParam("q", 1)}}}}, - {"missing parameter value item", - "text/html;a;q=1.0", - {{Token("text/html"), {BooleanParam("a", true), DoubleParam("q", 1)}}}}, - {"missing terminal parameter value item", - "text/html;q=1.0;a", - {{Token("text/html"), {DoubleParam("q", 1), BooleanParam("a", true)}}}}, - {"duplicate parameter keys with different value", - "text/html;a=1;b=2;a=3.0", - {{Token("text/html"), {DoubleParam("a", 3), Param("b", 2L)}}}, - "text/html;a=3.0;b=2"}, - {"multiple duplicate parameter keys at different position", - "text/html;c=1;a=2;b;b=3.0;a", - {{Token("text/html"), - {Param("c", 1L), BooleanParam("a", true), DoubleParam("b", 3)}}}, - "text/html;c=1;a;b=3.0"}, - {"duplicate parameter keys with missing value", - "text/html;a;a=1", - {{Token("text/html"), {Param("a", 1L)}}}, - "text/html;a=1"}, - {"whitespace before = parameterised item", "text/html, text/plain;q =0.5", - absl::nullopt}, - {"whitespace after = parameterised item", "text/html, text/plain;q= 0.5", - absl::nullopt}, - {"whitespace before ; parameterised item", "text/html, text/plain ;q=0.5", - absl::nullopt}, - {"whitespace after ; parameterised item", - "text/plain; q=0.5", - {{Token("text/plain"), {DoubleParam("q", 0.5)}}}, - "text/plain;q=0.5"}, - {"extra whitespace parameterised item", - "text/plain; q=0.5; charset=utf-8", - {{Token("text/plain"), - {DoubleParam("q", 0.5), TokenParam("charset", "utf-8")}}}, - "text/plain;q=0.5;charset=utf-8"}, -}; - -// For Structured Headers Draft 15 -const struct ListTestCase { - const char* name; - const char* raw; - const absl::optional<List> expected; // nullopt if parse error is expected. - const char* canonical; // nullptr if parse error is expected, or if canonical - // format is identical to raw. -} list_test_cases[] = { - // Lists of lists - {"extra whitespace list of lists", - "(1 42)", - {{{{{Integer(1L), {}}, {Integer(42L), {}}}, {}}}}, - "(1 42)"}, - // Parameterized Lists - {"basic parameterised list", - "abc_123;a=1;b=2; cdef_456, ghi;q=\"9\";r=\"+w\"", - {{{Token("abc_123"), - {Param("a", 1), Param("b", 2), BooleanParam("cdef_456", true)}}, - {Token("ghi"), {Param("q", "9"), Param("r", "+w")}}}}, - "abc_123;a=1;b=2;cdef_456, ghi;q=\"9\";r=\"+w\""}, - // Parameterized inner lists - {"parameterised basic list of lists", - "(1;a=1.0 2), (42 43)", - {{{{{Integer(1L), {DoubleParam("a", 1.0)}}, {Integer(2L), {}}}, {}}, - {{{Integer(42L), {}}, {Integer(43L), {}}}, {}}}}}, - {"parameters on inner members", - "(1;a=1.0 2;b=c), (42;d=?0 43;e=:Zmdo:)", - {{{{{Integer(1L), {DoubleParam("a", 1.0)}}, - {Integer(2L), {TokenParam("b", "c")}}}, - {}}, - {{{Integer(42L), {BooleanParam("d", false)}}, - {Integer(43L), {ByteSequenceParam("e", "fgh")}}}, - {}}}}}, - {"parameters on inner lists", - "(1 2);a=1.0, (42 43);b=?0", - {{{{{Integer(1L), {}}, {Integer(2L), {}}}, {DoubleParam("a", 1.0)}}, - {{{Integer(42L), {}}, {Integer(43L), {}}}, - {BooleanParam("b", false)}}}}}, - {"default true values for parameters on inner list members", - "(1;a 2), (42 43;b)", - {{{{{Integer(1L), {BooleanParam("a", true)}}, {Integer(2L), {}}}, {}}, - {{{Integer(42L), {}}, {Integer(43L), {BooleanParam("b", true)}}}, {}}}}}, - {"default true values for parameters on inner lists", - "(1 2);a, (42 43);b", - {{{{{Integer(1L), {}}, {Integer(2L), {}}}, {BooleanParam("a", true)}}, - {{{Integer(42L), {}}, {Integer(43L), {}}}, {BooleanParam("b", true)}}}}}, - {"extra whitespace before semicolon in parameters on inner list member", - "(a;b ;c b)", absl::nullopt}, - {"extra whitespace between parameters on inner list member", - "(a;b; c b)", - {{{{{Token("a"), {BooleanParam("b", true), BooleanParam("c", true)}}, - {Token("b"), {}}}, - {}}}}, - "(a;b;c b)"}, - {"extra whitespace before semicolon in parameters on inner list", - "(a b);c ;d, (e)", absl::nullopt}, - {"extra whitespace between parameters on inner list", - "(a b);c; d, (e)", - {{{{{Token("a"), {}}, {Token("b"), {}}}, - {BooleanParam("c", true), BooleanParam("d", true)}}, - {{{Token("e"), {}}}, {}}}}, - "(a b);c;d, (e)"}, -}; - -// For Structured Headers Draft 15 -const struct DictionaryTestCase { - const char* name; - const char* raw; - const absl::optional<Dictionary> - expected; // nullopt if parse error is expected. - const char* canonical; // nullptr if parse error is expected, or if canonical - // format is identical to raw. -} dictionary_test_cases[] = { - {"basic dictionary", - "en=\"Applepie\", da=:aGVsbG8=:", - {Dictionary{{{"en", {Item("Applepie"), {}}}, - {"da", {Item("hello", Item::kByteSequenceType), {}}}}}}}, - {"tab separated dictionary", - "a=1\t,\tb=2", - {Dictionary{{{"a", {Integer(1L), {}}}, {"b", {Integer(2L), {}}}}}}, - "a=1, b=2"}, - {"missing value with params dictionary", - "a=1, b;foo=9, c=3", - {Dictionary{{{"a", {Integer(1L), {}}}, - {"b", {Item(true), {Param("foo", 9)}}}, - {"c", {Integer(3L), {}}}}}}}, - // Parameterised dictionary tests - {"parameterised inner list member dict", - "a=(\"1\";b=1;c=?0 \"2\");d=\"e\"", - {Dictionary{{{"a", - {{{Item("1"), {Param("b", 1), BooleanParam("c", false)}}, - {Item("2"), {}}}, - {Param("d", "e")}}}}}}}, - {"explicit true value with parameter", - "a=?1;b=1", - {Dictionary{{{"a", {Item(true), {Param("b", 1)}}}}}}, - "a;b=1"}, - {"implicit true value with parameter", - "a;b=1", - {Dictionary{{{"a", {Item(true), {Param("b", 1)}}}}}}}, - {"implicit true value with implicitly-valued parameter", - "a;b", - {Dictionary{{{"a", {Item(true), {BooleanParam("b", true)}}}}}}}, -}; -} // namespace - -TEST(StructuredHeaderTest, ParseBareItem) { - for (const auto& c : item_test_cases) { - SCOPED_TRACE(c.name); - absl::optional<Item> result = ParseBareItem(c.raw); - EXPECT_EQ(result, c.expected); - } -} - -// For Structured Headers Draft 15, these tests include parameters on Items. -TEST(StructuredHeaderTest, ParseItem) { - for (const auto& c : parameterized_item_test_cases) { - SCOPED_TRACE(c.name); - absl::optional<ParameterizedItem> result = ParseItem(c.raw); - EXPECT_EQ(result, c.expected); - } -} - -// Structured Headers Draft 9 parsing rules are different than Draft 15, and -// some strings which are considered invalid in SH15 should parse in SH09. -// The SH09 Item parser is not directly exposed, but can be used indirectly by -// calling the parser for SH09-specific lists. -TEST(StructuredHeaderTest, ParseSH09Item) { - for (const auto& c : sh09_item_test_cases) { - SCOPED_TRACE(c.name); - absl::optional<ListOfLists> result = ParseListOfLists(c.raw); - if (c.expected.has_value()) { - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result->size(), 1UL); - EXPECT_EQ((*result)[0].size(), 1UL); - EXPECT_EQ((*result)[0][0], c.expected); - } else { - EXPECT_FALSE(result.has_value()); - } - } -} - -// In Structured Headers Draft 9, floats can have more than three fractional -// digits, and can be larger than 1e12. This behaviour is exposed in the parser -// for SH09-specific lists, so test it through that interface. -TEST(StructuredHeaderTest, SH09HighPrecisionFloats) { - // These values are exactly representable in binary floating point, so no - // accuracy issues are expected in this test. - absl::optional<ListOfLists> result = - ParseListOfLists("1.03125;-1.03125;12345678901234.5;-12345678901234.5"); - ASSERT_TRUE(result.has_value()); - EXPECT_EQ(*result, - (ListOfLists{{Item(1.03125), Item(-1.03125), Item(12345678901234.5), - Item(-12345678901234.5)}})); - - result = ParseListOfLists("123456789012345.0"); - EXPECT_FALSE(result.has_value()); - - result = ParseListOfLists("-123456789012345.0"); - EXPECT_FALSE(result.has_value()); -} - -// For Structured Headers Draft 9 -TEST(StructuredHeaderTest, ParseListOfLists) { - static const struct TestCase { - const char* name; - const char* raw; - ListOfLists expected; // empty if parse error is expected - } cases[] = { - {"basic list of lists", - "1;2, 42;43", - {{Integer(1L), Integer(2L)}, {Integer(42L), Integer(43L)}}}, - {"empty list of lists", "", {}}, - {"single item list of lists", "42", {{Integer(42L)}}}, - {"no whitespace list of lists", "1,42", {{Integer(1L)}, {Integer(42L)}}}, - {"no inner whitespace list of lists", - "1;2, 42;43", - {{Integer(1L), Integer(2L)}, {Integer(42L), Integer(43L)}}}, - {"extra whitespace list of lists", - "1 , 42", - {{Integer(1L)}, {Integer(42L)}}}, - {"extra inner whitespace list of lists", - "1 ; 2,42 ; 43", - {{Integer(1L), Integer(2L)}, {Integer(42L), Integer(43L)}}}, - {"trailing comma list of lists", "1;2, 42,", {}}, - {"trailing semicolon list of lists", "1;2, 42;43;", {}}, - {"leading comma list of lists", ",1;2, 42", {}}, - {"leading semicolon list of lists", ";1;2, 42;43", {}}, - {"empty item list of lists", "1,,42", {}}, - {"empty inner item list of lists", "1;;2,42", {}}, - }; - for (const auto& c : cases) { - SCOPED_TRACE(c.name); - absl::optional<ListOfLists> result = ParseListOfLists(c.raw); - if (!c.expected.empty()) { - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(*result, c.expected); - } else { - EXPECT_FALSE(result.has_value()); - } - } -} - -// For Structured Headers Draft 9 -TEST(StructuredHeaderTest, ParseParameterisedList) { - static const struct TestCase { - const char* name; - const char* raw; - ParameterisedList expected; // empty if parse error is expected - } cases[] = { - {"basic param-list", - "abc_123;a=1;b=2; cdef_456, ghi;q=\"9\";r=\"w\"", - { - {Token("abc_123"), - {Param("a", 1), Param("b", 2), NullParam("cdef_456")}}, - {Token("ghi"), {Param("q", "9"), Param("r", "w")}}, - }}, - {"empty param-list", "", {}}, - {"single item param-list", - "text/html;q=1", - {{Token("text/html"), {Param("q", 1)}}}}, - {"empty param-list", "", {}}, - {"no whitespace param-list", - "text/html,text/plain;q=1", - {{Token("text/html"), {}}, {Token("text/plain"), {Param("q", 1)}}}}, - {"whitespace before = param-list", "text/html, text/plain;q =1", {}}, - {"whitespace after = param-list", "text/html, text/plain;q= 1", {}}, - {"extra whitespace param-list", - "text/html , text/plain ; q=1", - {{Token("text/html"), {}}, {Token("text/plain"), {Param("q", 1)}}}}, - {"duplicate key", "abc;a=1;b=2;a=1", {}}, - {"numeric key", "abc;a=1;1b=2;c=1", {}}, - {"uppercase key", "abc;a=1;B=2;c=1", {}}, - {"bad key", "abc;a=1;b!=2;c=1", {}}, - {"another bad key", "abc;a=1;b==2;c=1", {}}, - {"empty key name", "abc;a=1;=2;c=1", {}}, - {"empty parameter", "abc;a=1;;c=1", {}}, - {"empty list item", "abc;a=1,,def;b=1", {}}, - {"extra semicolon", "abc;a=1;b=1;", {}}, - {"extra comma", "abc;a=1,def;b=1,", {}}, - {"leading semicolon", ";abc;a=1", {}}, - {"leading comma", ",abc;a=1", {}}, - }; - for (const auto& c : cases) { - SCOPED_TRACE(c.name); - absl::optional<ParameterisedList> result = ParseParameterisedList(c.raw); - if (c.expected.empty()) { - EXPECT_FALSE(result.has_value()); - continue; - } - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result->size(), c.expected.size()); - if (result->size() == c.expected.size()) { - for (size_t i = 0; i < c.expected.size(); ++i) - EXPECT_EQ((*result)[i], c.expected[i]); - } - } -} - -// For Structured Headers Draft 15 -TEST(StructuredHeaderTest, ParseList) { - for (const auto& c : list_test_cases) { - SCOPED_TRACE(c.name); - absl::optional<List> result = ParseList(c.raw); - EXPECT_EQ(result, c.expected); - } -} - -// For Structured Headers Draft 15 -TEST(StructuredHeaderTest, ParseDictionary) { - for (const auto& c : dictionary_test_cases) { - SCOPED_TRACE(c.name); - absl::optional<Dictionary> result = ParseDictionary(c.raw); - EXPECT_EQ(result, c.expected); - } -} - -// Serializer tests are all exclusively for Structured Headers Draft 15 - -TEST(StructuredHeaderTest, SerializeItem) { - for (const auto& c : item_test_cases) { - SCOPED_TRACE(c.name); - if (c.expected) { - absl::optional<std::string> result = SerializeItem(*c.expected); - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result.value(), std::string(c.canonical ? c.canonical : c.raw)); - } - } -} - -TEST(StructuredHeaderTest, SerializeParameterizedItem) { - for (const auto& c : parameterized_item_test_cases) { - SCOPED_TRACE(c.name); - if (c.expected) { - absl::optional<std::string> result = SerializeItem(*c.expected); - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result.value(), std::string(c.canonical ? c.canonical : c.raw)); - } - } -} - -TEST(StructuredHeaderTest, UnserializableItems) { - // Test that items with unknown type are not serialized. - EXPECT_FALSE(SerializeItem(Item()).has_value()); -} - -TEST(StructuredHeaderTest, UnserializableTokens) { - static const struct UnserializableString { - const char* name; - const char* value; - } bad_tokens[] = { - {"empty token", ""}, - {"contains high ascii", "a\xff"}, - {"contains nonprintable character", "a\x7f"}, - {"contains C0", "a\x01"}, - {"UTF-8 encoded", "a\xc3\xa9"}, - {"contains TAB", "a\t"}, - {"contains LF", "a\n"}, - {"contains CR", "a\r"}, - {"contains SP", "a "}, - {"begins with digit", "9token"}, - {"begins with hyphen", "-token"}, - {"begins with LF", "\ntoken"}, - {"begins with SP", " token"}, - {"begins with colon", ":token"}, - {"begins with percent", "%token"}, - {"begins with period", ".token"}, - {"begins with slash", "/token"}, - }; - for (const auto& bad_token : bad_tokens) { - SCOPED_TRACE(bad_token.name); - absl::optional<std::string> serialization = - SerializeItem(Token(bad_token.value)); - EXPECT_FALSE(serialization.has_value()) << *serialization; - } -} - -TEST(StructuredHeaderTest, UnserializableKeys) { - static const struct UnserializableString { - const char* name; - const char* value; - } bad_keys[] = { - {"empty key", ""}, - {"contains high ascii", "a\xff"}, - {"contains nonprintable character", "a\x7f"}, - {"contains C0", "a\x01"}, - {"UTF-8 encoded", "a\xc3\xa9"}, - {"contains TAB", "a\t"}, - {"contains LF", "a\n"}, - {"contains CR", "a\r"}, - {"contains SP", "a "}, - {"begins with uppercase", "Atoken"}, - {"begins with digit", "9token"}, - {"begins with hyphen", "-token"}, - {"begins with LF", "\ntoken"}, - {"begins with SP", " token"}, - {"begins with colon", ":token"}, - {"begins with percent", "%token"}, - {"begins with period", ".token"}, - {"begins with slash", "/token"}, - }; - for (const auto& bad_key : bad_keys) { - SCOPED_TRACE(bad_key.name); - absl::optional<std::string> serialization = - SerializeItem(ParameterizedItem("a", {{bad_key.value, "a"}})); - EXPECT_FALSE(serialization.has_value()) << *serialization; - } -} - -TEST(StructuredHeaderTest, UnserializableStrings) { - static const struct UnserializableString { - const char* name; - const char* value; - } bad_strings[] = { - {"contains high ascii", "a\xff"}, - {"contains nonprintable character", "a\x7f"}, - {"UTF-8 encoded", "a\xc3\xa9"}, - {"contains TAB", "a\t"}, - {"contains LF", "a\n"}, - {"contains CR", "a\r"}, - {"contains C0", "a\x01"}, - }; - for (const auto& bad_string : bad_strings) { - SCOPED_TRACE(bad_string.name); - absl::optional<std::string> serialization = - SerializeItem(Item(bad_string.value)); - EXPECT_FALSE(serialization.has_value()) << *serialization; - } -} - -TEST(StructuredHeaderTest, UnserializableIntegers) { - EXPECT_FALSE(SerializeItem(Integer(1e15L)).has_value()); - EXPECT_FALSE(SerializeItem(Integer(-1e15L)).has_value()); -} - -TEST(StructuredHeaderTest, UnserializableDecimals) { - for (double value : - {std::numeric_limits<double>::quiet_NaN(), - std::numeric_limits<double>::infinity(), - -std::numeric_limits<double>::infinity(), 1e12, 1e12 - 0.0001, - 1e12 - 0.0005, -1e12, -1e12 + 0.0001, -1e12 + 0.0005}) { - auto x = SerializeItem(Item(value)); - EXPECT_FALSE(SerializeItem(Item(value)).has_value()); - } -} - -// These values cannot be directly parsed from headers, but are valid doubles -// which can be serialized as sh-floats (though rounding is expected.) -TEST(StructuredHeaderTest, SerializeUnparseableDecimals) { - struct UnparseableDecimal { - const char* name; - double value; - const char* canonical; - } float_test_cases[] = { - {"negative 0", -0.0, "0.0"}, - {"0.0001", 0.0001, "0.0"}, - {"0.0000001", 0.0000001, "0.0"}, - {"1.0001", 1.0001, "1.0"}, - {"1.0009", 1.0009, "1.001"}, - {"round positive odd decimal", 0.0015, "0.002"}, - {"round positive even decimal", 0.0025, "0.002"}, - {"round negative odd decimal", -0.0015, "-0.002"}, - {"round negative even decimal", -0.0025, "-0.002"}, - {"round decimal up to integer part", 9.9995, "10.0"}, - {"subnormal numbers", std::numeric_limits<double>::denorm_min(), "0.0"}, - {"round up to 10 digits", 1e9 - 0.0000001, "1000000000.0"}, - {"round up to 11 digits", 1e10 - 0.000001, "10000000000.0"}, - {"round up to 12 digits", 1e11 - 0.00001, "100000000000.0"}, - {"largest serializable float", nextafter(1e12 - 0.0005, 0), - "999999999999.999"}, - {"largest serializable negative float", -nextafter(1e12 - 0.0005, 0), - "-999999999999.999"}, - // This will fail if we simply truncate the fractional portion. - {"float rounds up to next int", 3.9999999, "4.0"}, - // This will fail if we first round to >3 digits, and then round again to - // 3 digits. - {"don't double round", 3.99949, "3.999"}, - // This will fail if we first round to 3 digits, and then round again to - // max_avail_digits. - {"don't double round", 123456789.99949, "123456789.999"}, - }; - for (const auto& test_case : float_test_cases) { - SCOPED_TRACE(test_case.name); - absl::optional<std::string> serialization = - SerializeItem(Item(test_case.value)); - EXPECT_TRUE(serialization.has_value()); - EXPECT_EQ(*serialization, test_case.canonical); - } -} - -TEST(StructuredHeaderTest, SerializeList) { - for (const auto& c : list_test_cases) { - SCOPED_TRACE(c.name); - if (c.expected) { - absl::optional<std::string> result = SerializeList(*c.expected); - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result.value(), std::string(c.canonical ? c.canonical : c.raw)); - } - } -} - -TEST(StructuredHeaderTest, UnserializableLists) { - static const struct UnserializableList { - const char* name; - const List value; - } bad_lists[] = { - {"Null item as member", {{Item(), {}}}}, - {"Unserializable item as member", {{Token("\n"), {}}}}, - {"Key is empty", {{Token("abc"), {Param("", 1)}}}}, - {"Key contains whitespace", {{Token("abc"), {Param("a\n", 1)}}}}, - {"Key contains UTF8", {{Token("abc"), {Param("a\xc3\xa9", 1)}}}}, - {"Key contains unprintable characters", - {{Token("abc"), {Param("a\x7f", 1)}}}}, - {"Key contains disallowed characters", - {{Token("abc"), {Param("a:", 1)}}}}, - {"Param value is unserializable", {{Token("abc"), {{"a", Token("\n")}}}}}, - {"Inner list contains unserializable item", - {{std::vector<ParameterizedItem>{{Token("\n"), {}}}, {}}}}, - }; - for (const auto& bad_list : bad_lists) { - SCOPED_TRACE(bad_list.name); - absl::optional<std::string> serialization = SerializeList(bad_list.value); - EXPECT_FALSE(serialization.has_value()) << *serialization; - } -} - -TEST(StructuredHeaderTest, SerializeDictionary) { - for (const auto& c : dictionary_test_cases) { - SCOPED_TRACE(c.name); - if (c.expected) { - absl::optional<std::string> result = SerializeDictionary(*c.expected); - EXPECT_TRUE(result.has_value()); - EXPECT_EQ(result.value(), std::string(c.canonical ? c.canonical : c.raw)); - } - } -} - -TEST(StructuredHeaderTest, DictionaryConstructors) { - const std::string key0 = "key0"; - const std::string key1 = "key1"; - const ParameterizedMember member0{Item("Applepie"), {}}; - const ParameterizedMember member1{Item("hello", Item::kByteSequenceType), {}}; - - Dictionary dict; - EXPECT_TRUE(dict.empty()); - EXPECT_EQ(0U, dict.size()); - dict[key0] = member0; - EXPECT_FALSE(dict.empty()); - EXPECT_EQ(1U, dict.size()); - - const Dictionary dict_copy = dict; - EXPECT_FALSE(dict_copy.empty()); - EXPECT_EQ(1U, dict_copy.size()); - EXPECT_EQ(dict, dict_copy); - - const Dictionary dict_init{{{key0, member0}, {key1, member1}}}; - EXPECT_FALSE(dict_init.empty()); - EXPECT_EQ(2U, dict_init.size()); - EXPECT_EQ(member0, dict_init.at(key0)); - EXPECT_EQ(member1, dict_init.at(key1)); -} - -TEST(StructuredHeaderTest, DictionaryAccessors) { - const std::string key0 = "key0"; - const std::string key1 = "key1"; - - const ParameterizedMember nonempty_member0{Item("Applepie"), {}}; - const ParameterizedMember nonempty_member1{ - Item("hello", Item::kByteSequenceType), {}}; - const ParameterizedMember empty_member; - - Dictionary dict{{{key0, nonempty_member0}}}; - EXPECT_TRUE(dict.contains(key0)); - EXPECT_EQ(nonempty_member0, dict[key0]); - EXPECT_EQ(&dict[key0], &dict.at(key0)); - EXPECT_EQ(&dict[key0], &dict[0]); - EXPECT_EQ(&dict[key0], &dict.at(0)); - - // Even if the key does not yet exist in |dict|, operator[]() should - // automatically create an empty entry. - ASSERT_FALSE(dict.contains(key1)); - ParameterizedMember& member1 = dict[key1]; - EXPECT_TRUE(dict.contains(key1)); - EXPECT_EQ(empty_member, member1); - EXPECT_EQ(&member1, &dict[key1]); - EXPECT_EQ(&member1, &dict.at(key1)); - EXPECT_EQ(&member1, &dict[1]); - EXPECT_EQ(&member1, &dict.at(1)); - - member1 = nonempty_member1; - EXPECT_EQ(nonempty_member1, dict[key1]); - EXPECT_EQ(&dict[key1], &dict.at(key1)); - EXPECT_EQ(&dict[key1], &dict[1]); - EXPECT_EQ(&dict[key1], &dict.at(1)); - - // at(StringPiece) and indexed accessors have const overloads. - const Dictionary& dict_ref = dict; - EXPECT_EQ(&member1, &dict_ref.at(key1)); - EXPECT_EQ(&member1, &dict_ref[1]); - EXPECT_EQ(&member1, &dict_ref.at(1)); -} - -TEST(StructuredHeaderTest, UnserializableDictionary) { - static const struct UnserializableDictionary { - const char* name; - const Dictionary value; - } bad_dictionaries[] = { - {"Unserializable dict key", Dictionary{{{"ABC", {Token("abc"), {}}}}}}, - {"Dictionary item is unserializable", - Dictionary{{{"abc", {Token("abc="), {}}}}}}, - {"Param value is unserializable", - Dictionary{{{"abc", {Token("abc"), {{"a", Token("\n")}}}}}}}, - {"Dictionary inner-list contains unserializable item", - Dictionary{ - {{"abc", - {std::vector<ParameterizedItem>{{Token("abc="), {}}}, {}}}}}}, - }; - for (const auto& bad_dictionary : bad_dictionaries) { - SCOPED_TRACE(bad_dictionary.name); - absl::optional<std::string> serialization = - SerializeDictionary(bad_dictionary.value); - EXPECT_FALSE(serialization.has_value()) << *serialization; - } -} - -} // namespace structured_headers -} // namespace net
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn index 06c1917..b29ac01e 100644 --- a/net/third_party/quiche/BUILD.gn +++ b/net/third_party/quiche/BUILD.gn
@@ -109,6 +109,8 @@ "src/quiche/common/quiche_text_utils.h", "src/quiche/common/simple_buffer_allocator.cc", "src/quiche/common/simple_buffer_allocator.h", + "src/quiche/common/structured_headers.cc", + "src/quiche/common/structured_headers.h", "src/quiche/http2/adapter/data_source.h", "src/quiche/http2/adapter/event_forwarder.cc", "src/quiche/http2/adapter/event_forwarder.h", @@ -1321,6 +1323,8 @@ "src/quiche/common/quiche_mem_slice_storage_test.cc", "src/quiche/common/quiche_text_utils_test.cc", "src/quiche/common/simple_buffer_allocator_test.cc", + "src/quiche/common/structured_headers_generated_test.cc", + "src/quiche/common/structured_headers_test.cc", "src/quiche/http2/adapter/event_forwarder_test.cc", "src/quiche/http2/adapter/header_validator_test.cc", "src/quiche/http2/adapter/oghttp2_adapter_test.cc",
diff --git a/remoting/host/it2me/it2me_confirmation_dialog_chromeos_unittest.cc b/remoting/host/it2me/it2me_confirmation_dialog_chromeos_unittest.cc index 13c29f1b..7a0b35d 100644 --- a/remoting/host/it2me/it2me_confirmation_dialog_chromeos_unittest.cc +++ b/remoting/host/it2me/it2me_confirmation_dialog_chromeos_unittest.cc
@@ -27,16 +27,20 @@ namespace remoting { namespace { + using base::test::TestFuture; +using DialogStyle = It2MeConfirmationDialog::DialogStyle; constexpr char kTestingRemoteEmail[] = "remote@gmail.com"; + } // namespace -class It2MeConfirmationDialogChromeOSTest : public testing::Test { +class It2MeConfirmationDialogChromeOSTest + : public testing::TestWithParam<DialogStyle> { public: void SetUp() override { + dialog = CreateDialog(GetParam()); message_center::MessageCenter::Initialize( std::make_unique<message_center::FakeLockScreenController>()); - dialog = CreateEnterpriseDialog(); } void TearDown() override { @@ -48,12 +52,6 @@ return *message_center::MessageCenter::Get(); } - std::unique_ptr<It2MeConfirmationDialog> CreateEnterpriseDialog() { - It2MeConfirmationDialogFactory enterprise_factory{ - It2MeConfirmationDialog::DialogStyle::kEnterprise}; - return enterprise_factory.Create(); - } - int GetVisibleNotificationsCount() { return message_center().GetVisibleNotifications().size(); } @@ -97,8 +95,8 @@ } std::u16string FormatMessage(const std::string& remote_user_email, - It2MeConfirmationDialog::DialogStyle style) { - int message_id = (style == It2MeConfirmationDialog::DialogStyle::kEnterprise + DialogStyle style) { + int message_id = (style == DialogStyle::kEnterprise ? IDS_SHARE_CONFIRM_DIALOG_MESSAGE_ADMIN_INITIATED : IDS_SHARE_CONFIRM_DIALOG_MESSAGE_WITH_USERNAME); @@ -117,10 +115,15 @@ std::unique_ptr<It2MeConfirmationDialog> dialog; private: + std::unique_ptr<It2MeConfirmationDialog> CreateDialog( + DialogStyle dialog_style) { + It2MeConfirmationDialogFactory dialog_factory{dialog_style}; + return dialog_factory.Create(); + } base::test::SingleThreadTaskEnvironment environment_; }; -TEST_F(It2MeConfirmationDialogChromeOSTest, NotificationShouldHaveDesiredText) { +TEST_P(It2MeConfirmationDialogChromeOSTest, NotificationShouldHaveDesiredText) { dialog->Show(kTestingRemoteEmail, DoNothingCallback()); const message_center::Notification* notification = GetFirstNotification(); @@ -128,11 +131,10 @@ ASSERT_GT(notification->message().size(), 0llu); EXPECT_EQ(message_center().NotificationCount(), 1llu); EXPECT_EQ(notification->message(), - FormatMessage(kTestingRemoteEmail, - It2MeConfirmationDialog::DialogStyle::kEnterprise)); + FormatMessage(kTestingRemoteEmail, GetParam())); } -TEST_F(It2MeConfirmationDialogChromeOSTest, NotificationShouldBePersistent) { +TEST_P(It2MeConfirmationDialogChromeOSTest, NotificationShouldBePersistent) { dialog->Show(kTestingRemoteEmail, DoNothingCallback()); const message_center::Notification* notification = GetFirstNotification(); @@ -141,7 +143,7 @@ message_center::NotificationPriority::SYSTEM_PRIORITY); } -TEST_F(It2MeConfirmationDialogChromeOSTest, +TEST_P(It2MeConfirmationDialogChromeOSTest, NotificationShouldBeShownInDoNotDisturbMode) { dialog->Show(kTestingRemoteEmail, DoNothingCallback()); @@ -154,7 +156,7 @@ message_center::SystemNotificationWarningLevel::CRITICAL_WARNING); } -TEST_F(It2MeConfirmationDialogChromeOSTest, +TEST_P(It2MeConfirmationDialogChromeOSTest, NotificationShouldHaveConfirmAndCancelButton) { dialog->Show(kTestingRemoteEmail, DoNothingCallback()); @@ -170,7 +172,7 @@ 0); // Confirm button } -TEST_F(It2MeConfirmationDialogChromeOSTest, +TEST_P(It2MeConfirmationDialogChromeOSTest, NotificationShouldBeRemovedAndReturnCancelAfterUserCancels) { TestFuture<It2MeConfirmationDialog::Result> result_future; dialog->Show(kTestingRemoteEmail, result_future.GetCallback()); @@ -181,7 +183,7 @@ EXPECT_EQ(result_future.Get(), It2MeConfirmationDialog::Result::CANCEL); } -TEST_F(It2MeConfirmationDialogChromeOSTest, +TEST_P(It2MeConfirmationDialogChromeOSTest, NotificationShouldBeRemovedAndReturnOkAfterUserConfirms) { TestFuture<It2MeConfirmationDialog::Result> result_future; dialog->Show(kTestingRemoteEmail, result_future.GetCallback()); @@ -192,4 +194,12 @@ EXPECT_EQ(result_future.Get(), It2MeConfirmationDialog::Result::OK); } +INSTANTIATE_TEST_CASE_P(EnterpriseDialog, + It2MeConfirmationDialogChromeOSTest, + testing::Values(DialogStyle::kEnterprise)); + +INSTANTIATE_TEST_CASE_P(ConsumerDialog, + It2MeConfirmationDialogChromeOSTest, + testing::Values(DialogStyle::kConsumer)); + } // namespace remoting
diff --git a/testing/PRESUBMIT.py b/testing/PRESUBMIT.py index 61b4fc18..6a5524c 100644 --- a/testing/PRESUBMIT.py +++ b/testing/PRESUBMIT.py
@@ -23,7 +23,9 @@ input_api, output_api, '.', - [r'^.+_unittest\.py$'])) + [r'^.+_unittest\.py$'], + run_on_python3=USE_PYTHON3, + skip_shebang_check=True)) output.extend(input_api.canned_checks.RunUnitTestsInDirectory( input_api, output_api, @@ -36,21 +38,6 @@ output.extend(input_api.canned_checks.RunPylint( input_api, output_api, - files_to_skip=[r'gmock.*', r'gtest.*', - r'buildbot.*', r'merge_scripts.*', r'trigger_scripts.*', - r'unexpected_passes_common.*', - r'clusterfuzz.*', - r'libfuzzer.*'])) - # Pylint2.7 is run on subdirs whose presubmit checks are migrated to Python3 - output.extend(input_api.canned_checks.RunPylint( - input_api, - output_api, - files_to_check=[r'buildbot.*\.py$', - r'merge_scripts.*\.py$', - r'trigger_scripts.*\.py$', - r'unexpected_passes_common.*\.py$', - r'clusterfuzz.*\.py$', - r'libfuzzer.*\.py$'], version='2.7')) return output
diff --git a/testing/__init__.py b/testing/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/testing/__init__.py
diff --git a/testing/buildbot/PRESUBMIT_test.py b/testing/buildbot/PRESUBMIT_test.py index 0ef25a4..38e97fc 100755 --- a/testing/buildbot/PRESUBMIT_test.py +++ b/testing/buildbot/PRESUBMIT_test.py
@@ -3,10 +3,14 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import os +import sys import time import unittest -import PRESUBMIT +# Add src/testing/ into sys.path for importing PRESUBMIT without pylint errors. +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +from buildbot import PRESUBMIT class PresubmitError:
diff --git a/testing/buildbot/__init__.py b/testing/buildbot/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/testing/buildbot/__init__.py
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 8ef171a..4785bdf1 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -50217,5 +50217,81 @@ "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" } ] + }, + "android-webview-10-x86-rel-tests": { + "gtest_tests": [ + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webview_trichrome_cts_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/android_webview/tools/cts_archive", + "location": "android_webview/tools/cts_archive", + "revision": "7HRNj8Yv_CSQiyCoK8Y4Ld-h1virCHVES9Ed18Z75LkC" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-16.04|Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android29", + "path": ".android_emulator/generic_android29" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android29" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "webview_trichrome_cts_tests", + "test_id_prefix": "ninja://android_webview/test:webview_trichrome_cts_tests/" + } + ] } }
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 7e6513f..94c9cdd 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1129,6 +1129,20 @@ 'gtest_tests': 'android_weblayer_x86_pie_oreo_gtests', } }, + 'android-webview-10-x86-rel-tests': { + 'mixins': [ + 'has_native_resultdb_integration', + '10-x86-emulator', + 'emulator-4-cores', + 'linux-xenial-or-bionic', + 'x86-64', + ], + 'os_type': 'android', + 'test_suites': { + 'gtest_tests': 'webview_trichrome_cts_tests_gtest', + }, + 'use_swarming': True, + }, }, }, {
diff --git a/testing/chromoting/browser_tests_launcher.py b/testing/chromoting/browser_tests_launcher.py index 6f0ba62..c0dd849 100644 --- a/testing/chromoting/browser_tests_launcher.py +++ b/testing/chromoting/browser_tests_launcher.py
@@ -85,7 +85,7 @@ retries += 1 time.sleep(30) continue - elif jids_used: + if jids_used: print('JID used by test matched me2me host JID: %s' % host_jid) else: # There wasn't a mismatch and no JIDs were returned. If no JIDs were
diff --git a/testing/scripts/__init__.py b/testing/scripts/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/testing/scripts/__init__.py
diff --git a/testing/scripts/blink_lint_expectations.py b/testing/scripts/blink_lint_expectations.py index bb26b91..c1f2ad94 100755 --- a/testing/scripts/blink_lint_expectations.py +++ b/testing/scripts/blink_lint_expectations.py
@@ -7,8 +7,10 @@ import os import sys - -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/blink_python_tests.py b/testing/scripts/blink_python_tests.py index c7f14e68..a9c854b 100755 --- a/testing/scripts/blink_python_tests.py +++ b/testing/scripts/blink_python_tests.py
@@ -7,8 +7,10 @@ import os import sys - -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/check_gn_headers.py b/testing/scripts/check_gn_headers.py index 6530ada7..ccf0ba21 100755 --- a/testing/scripts/check_gn_headers.py +++ b/testing/scripts/check_gn_headers.py
@@ -7,8 +7,10 @@ import os import sys - -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/check_network_annotations.py b/testing/scripts/check_network_annotations.py index 6e2875d8..7d05b49a 100755 --- a/testing/scripts/check_network_annotations.py +++ b/testing/scripts/check_network_annotations.py
@@ -12,8 +12,10 @@ import os import sys - -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/check_static_initializers.py b/testing/scripts/check_static_initializers.py index 3afd112..dc9b1d27 100755 --- a/testing/scripts/check_static_initializers.py +++ b/testing/scripts/check_static_initializers.py
@@ -11,7 +11,10 @@ import subprocess import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common # A list of files that are allowed to have static initializers. # If something adds a static initializer, revert it. We don't accept regressions
diff --git a/testing/scripts/checkbins.py b/testing/scripts/checkbins.py index f66c8b1..af8208dc 100755 --- a/testing/scripts/checkbins.py +++ b/testing/scripts/checkbins.py
@@ -21,11 +21,14 @@ import os import sys - -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common WIN_PY3_TARGETS = ['python3.exe', 'python3.bat'] + def with_python3(): if sys.version_info.major >= 3: return sys.executable
diff --git a/testing/scripts/checkdeps.py b/testing/scripts/checkdeps.py index e772ae87..9c49d82 100755 --- a/testing/scripts/checkdeps.py +++ b/testing/scripts/checkdeps.py
@@ -8,7 +8,10 @@ import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/checklicenses.py b/testing/scripts/checklicenses.py index 43342d02..3a51fcf6 100755 --- a/testing/scripts/checklicenses.py +++ b/testing/scripts/checklicenses.py
@@ -8,7 +8,10 @@ import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/checkperms.py b/testing/scripts/checkperms.py index 8adb025..e635aa1 100755 --- a/testing/scripts/checkperms.py +++ b/testing/scripts/checkperms.py
@@ -8,7 +8,10 @@ import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/common.py b/testing/scripts/common.py index 1c31066d..d57595c 100644 --- a/testing/scripts/common.py +++ b/testing/scripts/common.py
@@ -18,7 +18,8 @@ logging.basicConfig(level=logging.INFO) # Add src/testing/ into sys.path for importing xvfb and test_env. -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) import test_env if sys.platform.startswith('linux'): import xvfb @@ -65,6 +66,8 @@ '\\ALL RESTRICTED APPLICATION PACKAGES:(I)(OI)(CI)(RX)' ] +# pylint: disable=useless-object-inheritance + def set_lpac_acls(acl_dir, is_test_script=False): """Sets LPAC ACLs on a directory. Windows 10 only.""" @@ -231,7 +234,7 @@ passing_statuses = ('PASS', 'SLOW', 'NEEDSREBASELINE') for test, result in convert_trie_to_flat_paths( - json_results['tests']).iteritems(): + json_results['tests']).items(): key = 'unexpected_' if result.get('is_unexpected') else '' data = result['actual'] actual_results = data.split()
diff --git a/testing/scripts/content_shell_crash_test.py b/testing/scripts/content_shell_crash_test.py index fe3515a7..60f76a75 100755 --- a/testing/scripts/content_shell_crash_test.py +++ b/testing/scripts/content_shell_crash_test.py
@@ -9,11 +9,11 @@ import sys -import common - -# Add src/testing/ into sys.path for importing xvfb. -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +# Add src/testing/ into sys.path for importing xvfb and common. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) import xvfb +from scripts import common # Unfortunately we need to copy these variables from ../test_env.py.
diff --git a/testing/scripts/count_filtered_tests.py b/testing/scripts/count_filtered_tests.py index 97bb8f54..588c87f 100644 --- a/testing/scripts/count_filtered_tests.py +++ b/testing/scripts/count_filtered_tests.py
@@ -9,7 +9,10 @@ import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def ParseTestList(test_list_contents):
diff --git a/testing/scripts/get_compile_targets.py b/testing/scripts/get_compile_targets.py index 3772d50a..75e15dc9d 100755 --- a/testing/scripts/get_compile_targets.py +++ b/testing/scripts/get_compile_targets.py
@@ -8,7 +8,10 @@ import os import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main(argv): @@ -51,7 +54,11 @@ return rc with open(tempfile_path) as f: - results[filename] = json.load(f) + # json.load() throws a ValueError for empty files + try: + results[filename] = json.load(f) + except ValueError: + pass with open(args.output, 'w') as f: json.dump(results, f)
diff --git a/testing/scripts/gpu_integration_test_adapter.py b/testing/scripts/gpu_integration_test_adapter.py index 8c12571..6aae983e 100644 --- a/testing/scripts/gpu_integration_test_adapter.py +++ b/testing/scripts/gpu_integration_test_adapter.py
@@ -2,7 +2,14 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import common +import os +import sys + +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common + class GpuIntegrationTestAdapater(common.BaseIsolatedScriptArgsAdapter):
diff --git a/testing/scripts/grit_python_unittests.py b/testing/scripts/grit_python_unittests.py index 532e4b1..9a2218e 100755 --- a/testing/scripts/grit_python_unittests.py +++ b/testing/scripts/grit_python_unittests.py
@@ -11,7 +11,10 @@ import os import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/headless_python_unittests.py b/testing/scripts/headless_python_unittests.py index 881cff4a..4e32907 100755 --- a/testing/scripts/headless_python_unittests.py +++ b/testing/scripts/headless_python_unittests.py
@@ -7,8 +7,10 @@ import os import sys - -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args): @@ -16,7 +18,7 @@ os.path.dirname(__file__), os.path.pardir, os.path.pardir, 'third_party', 'catapult', 'third_party', 'typ')) _AddToPathIfNeeded(typ_path) - import typ + import typ #pylint: disable=import-outside-toplevel top_level_dir = os.path.join( common.SRC_DIR, 'headless', 'lib', 'browser', 'devtools_api')
diff --git a/testing/scripts/host_info.py b/testing/scripts/host_info.py index 63e3b9ba..86c8514 100755 --- a/testing/scripts/host_info.py +++ b/testing/scripts/host_info.py
@@ -9,7 +9,10 @@ import platform import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def is_linux(): @@ -88,7 +91,7 @@ v['ro.build.fingerprint'] for v in device_info if not v['denylisted']] def unique_build_details(index): - return sorted(list(set([v.split(':')[index] for v in details]))) + return sorted(list({v.split(':')[index] for v in details})) parsed_details = { 'device_names': unique_build_details(0),
diff --git a/testing/scripts/metrics_python_tests.py b/testing/scripts/metrics_python_tests.py index 70770f41..2746430 100755 --- a/testing/scripts/metrics_python_tests.py +++ b/testing/scripts/metrics_python_tests.py
@@ -9,8 +9,10 @@ import os import sys - -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common def main_run(args):
diff --git a/testing/scripts/run_cast_core_tests.py b/testing/scripts/run_cast_core_tests.py index f94e106..7d5e9e9 100755 --- a/testing/scripts/run_cast_core_tests.py +++ b/testing/scripts/run_cast_core_tests.py
@@ -19,9 +19,13 @@ """ import json +import os import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common class CastCoreIntegrationTestAdapter(common.BaseIsolatedScriptArgsAdapter): @@ -47,4 +51,4 @@ 'compile_targets': main_compile_targets, } sys.exit(common.run_script(sys.argv[1:], funcs)) - sys.exit(main()) \ No newline at end of file + sys.exit(main())
diff --git a/testing/scripts/run_chromedriver_tests.py b/testing/scripts/run_chromedriver_tests.py index b1f67ce..203ae32 100755 --- a/testing/scripts/run_chromedriver_tests.py +++ b/testing/scripts/run_chromedriver_tests.py
@@ -25,7 +25,10 @@ import tempfile import traceback -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common class ChromeDriverAdapter(common.BaseIsolatedScriptArgsAdapter):
diff --git a/testing/scripts/run_devtools_check.py b/testing/scripts/run_devtools_check.py index 104f5f72..9f9be63 100755 --- a/testing/scripts/run_devtools_check.py +++ b/testing/scripts/run_devtools_check.py
@@ -21,11 +21,11 @@ import sys -import common - -# Add src/testing/ into sys.path for importing xvfb. -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +# Add src/testing/ into sys.path for importing xvfb and common. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) import xvfb +from scripts import common def main():
diff --git a/testing/scripts/run_finch_smoke_tests_android.py b/testing/scripts/run_finch_smoke_tests_android.py index e3d91220..cd12b7e 100755 --- a/testing/scripts/run_finch_smoke_tests_android.py +++ b/testing/scripts/run_finch_smoke_tests_android.py
@@ -19,6 +19,7 @@ SRC_DIR = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) +PAR_DIR = os.path.join(SRC_DIR, 'testing') OUT_DIR = os.path.join(SRC_DIR, 'out', 'Release') BLINK_TOOLS = os.path.join( SRC_DIR, 'third_party', 'blink', 'tools') @@ -46,10 +47,11 @@ if WEBVIEW_VARIATIONS_PROTO not in sys.path: sys.path.append(WEBVIEW_VARIATIONS_PROTO) +sys.path.append(PAR_DIR) + if 'compile_targets' not in sys.argv: import aw_variations_seed_pb2 -import common import devil_chromium import wpt_common @@ -66,6 +68,7 @@ from devil.utils import logging_common from pylib.local.emulator import avd from py_utils.tempfile_ext import NamedTemporaryDirectory +from scripts import common from skia_gold_infra.finch_skia_gold_properties import FinchSkiaGoldProperties from skia_gold_infra import finch_skia_gold_session_manager from skia_gold_infra import finch_skia_gold_utils @@ -82,6 +85,8 @@ logger.setLevel(logging.INFO) TEST_CASES = {} +# pylint: disable=super-with-arguments + class FinchTestCase(wpt_common.BaseWptScriptAdapter): @@ -95,6 +100,7 @@ self.browser_activity_name = (self.options.browser_activity_name or self.default_browser_activity_name) self.log_mon = None + self.layout_test_results_subdir = None self.test_specific_browser_args = [] if self.options.webview_provider_apk: self.webview_provider_package_name = (
diff --git a/testing/scripts/run_flatbuffers_unittests.py b/testing/scripts/run_flatbuffers_unittests.py index c9b8fde9..daea0f5 100755 --- a/testing/scripts/run_flatbuffers_unittests.py +++ b/testing/scripts/run_flatbuffers_unittests.py
@@ -20,11 +20,14 @@ import os import sys -import common - -# Add src/testing/ into sys.path for importing xvfb and test_env. -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +# Add src/testing/ into sys.path for importing xvfb and common. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) import xvfb +from scripts import common + +# pylint: disable=super-with-arguments + def main(): parser = argparse.ArgumentParser()
diff --git a/testing/scripts/run_gpu_integration_test_as_googletest.py b/testing/scripts/run_gpu_integration_test_as_googletest.py index dc5e128..3456a7e 100755 --- a/testing/scripts/run_gpu_integration_test_as_googletest.py +++ b/testing/scripts/run_gpu_integration_test_as_googletest.py
@@ -19,11 +19,16 @@ """ import json +import os import sys -import common import gpu_integration_test_adapter +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common + def main(): adapter = gpu_integration_test_adapter.GpuIntegrationTestAdapater()
diff --git a/testing/scripts/run_isolated_script_test.py b/testing/scripts/run_isolated_script_test.py index fed58832..0e963d6 100755 --- a/testing/scripts/run_isolated_script_test.py +++ b/testing/scripts/run_isolated_script_test.py
@@ -26,7 +26,11 @@ import tempfile -import common +# Add src/testing/ into sys.path for importing xvfb and common. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +import xvfb +from scripts import common # Some harnesses understand the --isolated-script-test arguments @@ -52,10 +56,9 @@ 'test_suite_all.py', # //tools/grit:grit_python_unittests } -class IsolatedScriptTestAdapter(common.BaseIsolatedScriptArgsAdapter): - def __init__(self): - super(IsolatedScriptTestAdapter, self).__init__() +# pylint: disable=super-with-arguments +class IsolatedScriptTestAdapter(common.BaseIsolatedScriptArgsAdapter): def generate_sharding_args(self, total_shards, shard_index): # This script only uses environment variable for sharding. del total_shards, shard_index # unused @@ -118,9 +121,6 @@ return 'vpython3.bat' if sys.platform == 'win32' else 'vpython3' return super(TypUnittestAdapter, self).select_python_executable() - def run_test(self): - return super(TypUnittestAdapter, self).run_test() - def main(): if any(r in sys.argv[1] for r in KNOWN_ISOLATED_SCRIPT_TEST_RUNNERS):
diff --git a/testing/scripts/run_isolated_script_test.pydeps b/testing/scripts/run_isolated_script_test.pydeps index bc8ff58..df35f82 100644 --- a/testing/scripts/run_isolated_script_test.pydeps +++ b/testing/scripts/run_isolated_script_test.pydeps
@@ -4,6 +4,7 @@ //build/util/lib/results/__init__.py //build/util/lib/results/result_sink.py //build/util/lib/results/result_types.py +//testing/scripts/__init__.py //testing/scripts/common.py //testing/scripts/run_isolated_script_test.py //testing/test_env.py
diff --git a/testing/scripts/run_performance_tests.py b/testing/scripts/run_performance_tests.py index b687be8..a46efbe5 100755 --- a/testing/scripts/run_performance_tests.py +++ b/testing/scripts/run_performance_tests.py
@@ -48,11 +48,11 @@ import traceback import six -import common from collections import OrderedDict CHROMIUM_SRC_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), '..', '..')) + os.path.join(os.path.dirname(__file__), + os.path.pardir, os.path.pardir)) PERF_DIR = os.path.join(CHROMIUM_SRC_DIR, 'tools', 'perf') sys.path.append(PERF_DIR) @@ -63,19 +63,21 @@ sys.path.append(PERF_CORE_DIR) import results_merger -# Add src/testing/ into sys.path for importing xvfb and test_env. -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +# Add src/testing/ into sys.path for importing xvfb, test_env, and common. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) import xvfb import test_env +from scripts import common # Unfortunately we need to copy these variables from ../test_env.py. # Importing it and using its get_sandbox_env breaks test runs on Linux # (it seems to unset DISPLAY). CHROME_SANDBOX_ENV = 'CHROME_DEVEL_SANDBOX' CHROME_SANDBOX_PATH = '/opt/chromium/chrome_sandbox' -SHARD_MAPS_DIRECTORY = os.path.join( - os.path.dirname(__file__), '..', '..', 'tools', 'perf', 'core', - 'shard_maps') +SHARD_MAPS_DIRECTORY = os.path.abspath( + os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir, + 'tools', 'perf', 'core', 'shard_maps')) # See https://crbug.com/923564. # We want to switch over to using histograms for everything, but converting from @@ -106,6 +108,8 @@ 'xr.vr.common_perftests', ] +# pylint: disable=useless-object-inheritance + class OutputFilePaths(object): """Provide paths to where results outputs should be written. @@ -188,8 +192,7 @@ executable = str(self.executable_name) if IsWindows(): return r'.\%s.exe' % executable - else: - return './%s' % executable + return './%s' % executable def _get_additional_flags(self): return self._additional_flags @@ -246,7 +249,7 @@ benchmark_name: { 'expected': 'PASS', 'actual': 'FAIL' if return_code else 'PASS', - 'is_unexpected': True if return_code else False, + 'is_unexpected': bool(return_code), }, }, 'interrupted': False, @@ -353,9 +356,9 @@ if os.path.exists(output_paths.perf_results): if command_generator.executable_name in GTEST_CONVERSION_WHITELIST: with path_util.SysPath(path_util.GetTracingDir()): - # pylint: disable=no-name-in-module + # pylint: disable=no-name-in-module,import-outside-toplevel from tracing.value import gtest_json_converter - # pylint: enable=no-name-in-module + # pylint: enable=no-name-in-module,import-outside-toplevel gtest_json_converter.ConvertGtestJsonFile(output_paths.perf_results) else: print('ERROR: gtest perf test %s did not generate perf output' %
diff --git a/testing/scripts/run_rendering_benchmark_with_gated_performance.py b/testing/scripts/run_rendering_benchmark_with_gated_performance.py index 1011ac3..39537a0 100755 --- a/testing/scripts/run_rendering_benchmark_with_gated_performance.py +++ b/testing/scripts/run_rendering_benchmark_with_gated_performance.py
@@ -26,9 +26,13 @@ import numpy as np -import common import run_performance_tests +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common + # AVG_ERROR_MARGIN determines how much more the value of frame times can be # compared to the recorded value (multiplier of upper limit). AVG_ERROR_MARGIN = 1.1 @@ -40,6 +44,9 @@ METRIC_NAME = 'frame_times' +# pylint: disable=useless-object-inheritance + + class ResultRecorder(object): def __init__(self): self.fails = 0 @@ -152,7 +159,7 @@ # least by 10 [AVG_ERROR_MARGIN] percent of upper limit, that would be # considered a failure. crbug.com/953895 with open( - os.path.join(os.path.dirname(__file__), + os.path.join(os.path.dirname(os.path.abspath(__file__)), 'representative_perf_test_data', 'representatives_frame_times_upper_limit.json') ) as bound_data:
diff --git a/testing/scripts/run_telemetry_as_googletest.py b/testing/scripts/run_telemetry_as_googletest.py index e05f733..b67063bb 100755 --- a/testing/scripts/run_telemetry_as_googletest.py +++ b/testing/scripts/run_telemetry_as_googletest.py
@@ -23,7 +23,10 @@ import os import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common class TelemetryUnittestAdapter(common.BaseIsolatedScriptArgsAdapter):
diff --git a/testing/scripts/run_variations_smoke_tests.py b/testing/scripts/run_variations_smoke_tests.py index b681e54a..6e72c55 100755 --- a/testing/scripts/run_variations_smoke_tests.py +++ b/testing/scripts/run_variations_smoke_tests.py
@@ -21,12 +21,16 @@ from skia_gold_infra.finch_skia_gold_properties import FinchSkiaGoldProperties from skia_gold_infra import finch_skia_gold_utils -import common import variations_seed_access_helper as seed_helper _THIS_DIR = os.path.abspath(os.path.dirname(__file__)) _VARIATIONS_TEST_DATA = 'variations_smoke_test_data' +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common + from selenium import webdriver from selenium.webdriver import ChromeOptions from selenium.common.exceptions import NoSuchElementException @@ -84,7 +88,7 @@ 'Windows (win32 or cygwin) are supported' % sys.platform) -def _find_chrome_binary(): +def _find_chrome_binary(): #pylint: disable=inconsistent-return-statements """Finds and returns the relative path to the Chrome binary. This function assumes that the CWD is the build directory. @@ -95,11 +99,11 @@ platform = _get_platform() if platform == 'linux': return os.path.join('.', 'chrome') - elif platform == 'mac': + if platform == 'mac': chrome_name = 'Google Chrome' return os.path.join('.', chrome_name + '.app', 'Contents', 'MacOS', chrome_name) - elif platform == 'win': + if platform == 'win': return os.path.join('.', 'chrome.exe')
diff --git a/testing/scripts/run_wpt_tests.py b/testing/scripts/run_wpt_tests.py index 82bc4b0cc..3726bcd1 100755 --- a/testing/scripts/run_wpt_tests.py +++ b/testing/scripts/run_wpt_tests.py
@@ -12,9 +12,13 @@ import os import sys -import common import wpt_common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common + logger = logging.getLogger(__name__) SRC_DIR = os.path.abspath( @@ -54,6 +58,7 @@ _ANDROID_ENABLED = False +# pylint: disable=super-with-arguments def _make_pass_through_action(dest, map_arg=lambda arg: arg): class PassThroughAction(argparse.Action): def __init__(self, option_strings, dest, nargs=None, **kwargs): @@ -174,7 +179,7 @@ def log_level(self): if self.options.verbose >= 2: return logging.DEBUG - elif self.options.verbose >= 1: + if self.options.verbose >= 1: return logging.INFO return logging.WARNING @@ -431,7 +436,7 @@ def wpt_args(self): """list[str]: Arguments to add to a 'wpt run' command.""" args = [] - version = self.get_version() + version = self.get_version() # pylint: disable=assignment-from-none if version: args.append('--browser-version=%s' % version) webdriver = self.webdriver_binary @@ -698,12 +703,11 @@ return webview_app.UseWebViewProvider( device, self._options.webview_provider) - else: - assert self._options.release_channel, 'no webview install method' - return _install_webview_from_release( - device, - self._options.release_channel, - self._python_executable) + assert self._options.release_channel, 'no webview install method' + return _install_webview_from_release( + device, + self._options.release_channel, + self._python_executable) def _validate_options(self): super(WebView, self)._validate_options()
diff --git a/testing/scripts/run_wpt_tests.pydeps b/testing/scripts/run_wpt_tests.pydeps index 44d05630..d91f69b1 100644 --- a/testing/scripts/run_wpt_tests.pydeps +++ b/testing/scripts/run_wpt_tests.pydeps
@@ -20,6 +20,7 @@ //build/util/lib/results/__init__.py //build/util/lib/results/result_sink.py //build/util/lib/results/result_types.py +//testing/scripts/__init__.py //testing/scripts/common.py //testing/scripts/run_wpt_tests.py //testing/scripts/wpt_common.py
diff --git a/testing/scripts/rust/rust_main_program.py b/testing/scripts/rust/rust_main_program.py index 080dd2b..a1f95202 100644 --- a/testing/scripts/rust/rust_main_program.py +++ b/testing/scripts/rust/rust_main_program.py
@@ -11,7 +11,7 @@ import subprocess import sys -sys.path.append(os.path.dirname(__file__)) +sys.path.append(os.path.dirname(os.path.abspath(__file__))) import exe_util import main_program import test_results
diff --git a/testing/scripts/rust/test_filtering.py b/testing/scripts/rust/test_filtering.py index a386dd0..bc9c7eea 100644 --- a/testing/scripts/rust/test_filtering.py +++ b/testing/scripts/rust/test_filtering.py
@@ -56,8 +56,7 @@ """ if self._is_prefix_match: return test_name.startswith(self._filter_text) - else: - return test_name == self._filter_text + return test_name == self._filter_text def is_exclusion_filter(self): """Rreturns whether this filter excludes (rather than includes) matching
diff --git a/testing/scripts/skia_gold_infra/finch_skia_gold_utils.py b/testing/scripts/skia_gold_infra/finch_skia_gold_utils.py index a6784bfb..8d6d3d3 100644 --- a/testing/scripts/skia_gold_infra/finch_skia_gold_utils.py +++ b/testing/scripts/skia_gold_infra/finch_skia_gold_utils.py
@@ -134,4 +134,3 @@ 'Given unhandled SkiaGoldSession StatusCode %s with error %s', status, error) return triage_link -
diff --git a/testing/scripts/test_buildbucket_api_gpu_use_cases.py b/testing/scripts/test_buildbucket_api_gpu_use_cases.py index af2b7f8..b4652a6c 100755 --- a/testing/scripts/test_buildbucket_api_gpu_use_cases.py +++ b/testing/scripts/test_buildbucket_api_gpu_use_cases.py
@@ -10,11 +10,15 @@ import os import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common # Add src/content/test/gpu into sys.path for importing common. -sys.path.append(os.path.join(os.path.dirname(__file__), - '..', '..', 'content', 'test', 'gpu')) +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), + os.path.pardir, os.path.pardir, 'content', + 'test', 'gpu'))) import gather_power_measurement_results import gather_swarming_json_results
diff --git a/testing/scripts/test_traffic_annotation_auditor.py b/testing/scripts/test_traffic_annotation_auditor.py index 01f6399..bcd0fb1 100755 --- a/testing/scripts/test_traffic_annotation_auditor.py +++ b/testing/scripts/test_traffic_annotation_auditor.py
@@ -15,7 +15,10 @@ import tempfile import traceback -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common WINDOWS_SHEET_CONFIG = { "spreadsheet_id": "1TmBr9jnf1-hrjntiVBzT9EtkINGrtoBYFMWad2MBeaY",
diff --git a/testing/scripts/wpt_common.py b/testing/scripts/wpt_common.py index 4a86345..33cb0c3 100644 --- a/testing/scripts/wpt_common.py +++ b/testing/scripts/wpt_common.py
@@ -8,7 +8,10 @@ import os import sys -import common +# Add src/testing/ into sys.path for importing common without pylint errors. +sys.path.append( + os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) +from scripts import common BLINK_TOOLS_DIR = os.path.join(common.SRC_DIR, 'third_party', 'blink', 'tools') CATAPULT_DIR = os.path.join(common.SRC_DIR, 'third_party', 'catapult') @@ -30,6 +33,7 @@ logger = logging.getLogger(__name__) +# pylint: disable=super-with-arguments class BaseWptScriptAdapter(common.BaseIsolatedScriptArgsAdapter): """The base class for script adapters that use wptrunner to execute web platform tests. This contains any code shared between these scripts, such @@ -210,6 +214,7 @@ def generate_test_repeat_args(self, repeat_count): return ['--repeat=%d' % repeat_count] + # pylint: disable=unused-argument def generate_test_launcher_retry_limit_args(self, retry_limit): # TODO(crbug/1306222): wptrunner currently cannot rerun individual # failed tests, so this flag is accepted but not used.
diff --git a/testing/test_env.py b/testing/test_env.py index fa8df4c..43083fc 100755 --- a/testing/test_env.py +++ b/testing/test_env.py
@@ -289,13 +289,15 @@ if p.poll() is not None: continue # SIGBREAK is defined only for win32. + # pylint: disable=no-member if sys.platform == 'win32' and sig == signal.SIGBREAK: p.send_signal(signal.CTRL_BREAK_EVENT) else: print("Forwarding signal(%d) to process %d" % (sig, p.pid)) p.send_signal(sig) + # pylint: enable=no-member if sys.platform == 'win32': - signal.signal(signal.SIGBREAK, _sig_handler) + signal.signal(signal.SIGBREAK, _sig_handler) # pylint: disable=no-member else: signal.signal(signal.SIGTERM, _sig_handler) signal.signal(signal.SIGINT, _sig_handler) @@ -349,11 +351,13 @@ if '--coverage-continuous-mode=1' in cmd: extra_env.update(get_coverage_continuous_mode_env(env)) + # pylint: disable=import-outside-toplevel if '--skip-set-lpac-acls=1' not in cmd and sys.platform == 'win32': sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'scripts')) - import common + from scripts import common common.set_lpac_acls(ROOT_DIR, is_test_script=True) + # pylint: enable=import-outside-toplevel cmd = trim_cmd(cmd) @@ -379,7 +383,7 @@ if stdoutfile: # Write to stdoutfile and poll to produce terminal output. return run_command_with_output(cmd, env=env, stdoutfile=stdoutfile) - elif use_symbolization_script: + if use_symbolization_script: # See above comment regarding offline symbolization. # Need to pipe to the symbolizer script. p1 = _popen(cmd, env=env, stdout=subprocess.PIPE, @@ -394,8 +398,7 @@ # Also feed the out-of-band JSON output to the symbolizer script. symbolize_snippets_in_json(cmd, env) return p1.returncode - else: - return run_command(cmd, env=env, log=False) + return run_command(cmd, env=env, log=False) except OSError: print('Failed to start %s' % cmd, file=sys.stderr) raise
diff --git a/testing/test_env_test_script.py b/testing/test_env_test_script.py index 4957ee65..e318141 100755 --- a/testing/test_env_test_script.py +++ b/testing/test_env_test_script.py
@@ -19,5 +19,5 @@ signal.signal(signal.SIGTERM, print_signal) signal.signal(signal.SIGINT, print_signal) if sys.platform == 'win32': - signal.signal(signal.SIGBREAK, print_signal) + signal.signal(signal.SIGBREAK, print_signal) # pylint: disable=no-member time.sleep(2) # gives process time to receive signal.
diff --git a/testing/test_env_unittest.py b/testing/test_env_unittest.py index 707c65e..8ec6194 100755 --- a/testing/test_env_unittest.py +++ b/testing/test_env_unittest.py
@@ -20,6 +20,8 @@ HERE = os.path.dirname(os.path.abspath(__file__)) TEST_SCRIPT = os.path.join(HERE, 'test_env_user_script.py') +# pylint: disable=super-with-arguments + def launch_process_windows(args): # The `universal_newlines` option is equivalent to `text` in Python 3. @@ -42,11 +44,13 @@ universal_newlines=True) +# pylint: disable=inconsistent-return-statements def read_subprocess_message(proc, starts_with): """Finds the value after first line prefix condition.""" for line in proc.stdout: if line.startswith(starts_with): return line.rstrip().replace(starts_with, '') +# pylint: enable=inconsistent-return-statements def send_and_wait(proc, sig, sleep_time=0.3): @@ -65,9 +69,9 @@ def test_send_ctrl_break_event(self): proc = launch_process_windows([]) - send_and_wait(proc, signal.CTRL_BREAK_EVENT) + send_and_wait(proc, signal.CTRL_BREAK_EVENT) # pylint: disable=no-member sig = read_subprocess_message(proc, 'Signal :') - self.assertEqual(sig, str(int(signal.SIGBREAK))) + self.assertEqual(sig, str(int(signal.SIGBREAK))) # pylint: disable=no-member class SignalingNonWindowsTest(unittest.TestCase):
diff --git a/testing/unexpected_passes_common/unittest_utils.py b/testing/unexpected_passes_common/unittest_utils.py index 2df2f251..bfc3b405 100644 --- a/testing/unexpected_passes_common/unittest_utils.py +++ b/testing/unexpected_passes_common/unittest_utils.py
@@ -141,11 +141,15 @@ class GenericBuilders(builders.Builders): + #pylint: disable=useless-super-delegation def __init__(self, include_internal_builders=False): super(GenericBuilders, self).__init__(include_internal_builders) + #pylint: enable=useless-super-delegation + #pylint: disable=unused-argument def _BuilderRunsTestOfInterest(self, test_map, suite): return True + #pylint: enable=unused-argument def GetIsolateNames(self): return {}
diff --git a/testing/variations/PRESUBMIT.py b/testing/variations/PRESUBMIT.py index e854e162..fe53483 100644 --- a/testing/variations/PRESUBMIT.py +++ b/testing/variations/PRESUBMIT.py
@@ -257,10 +257,10 @@ json_data, f.AbsoluteLocalPath(), output_api.PresubmitError) - if len(result): + if result: return result result = CheckPretty(contents, f.LocalPath(), output_api.PresubmitError) - if len(result): + if result: return result except ValueError: return [
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 15a72a0..7e6939c 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -3292,6 +3292,21 @@ ] } ], + "EnhancedSafeBrowsing": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "SafeBrowsingEnhancedProtection" + ] + } + ] + } + ], "EstablishGpuChannelAsync": [ { "platforms": [ @@ -5270,6 +5285,28 @@ ] } ], + "OptimizeNetworkBuffers": [ + { + "platforms": [ + "android", + "android_weblayer", + "android_webview", + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "OptimizeNetworkBuffers" + ] + } + ] + } + ], "OptimizeViewportConstrainedPaintInvalidation": [ { "platforms": [
diff --git a/testing/xvfb.py b/testing/xvfb.py index c1f5f76..a301e55a 100755 --- a/testing/xvfb.py +++ b/testing/xvfb.py
@@ -23,15 +23,15 @@ import test_env +# pylint: disable=useless-object-inheritance + class _XvfbProcessError(Exception): """Exception raised when Xvfb cannot start.""" - pass class _WestonProcessError(Exception): """Exception raised when Weston cannot start.""" - pass def kill(proc, name, timeout_in_seconds=10): @@ -54,7 +54,7 @@ file=sys.stderr) -def launch_dbus(env): +def launch_dbus(env): # pylint: disable=inconsistent-return-statements """Starts a DBus session. Works around a bug in GLib where it performs operations which aren't @@ -136,10 +136,9 @@ if sys.platform.startswith('linux') and use_xvfb: return _run_with_xvfb(cmd, env, stdoutfile, use_openbox, use_xcompmgr) - elif use_weston: + if use_weston: return _run_with_weston(cmd, env, stdoutfile) - else: - return test_env.run_executable(cmd, env, stdoutfile) + return test_env.run_executable(cmd, env, stdoutfile) def _run_with_xvfb(cmd, env, stdoutfile, use_openbox, use_xcompmgr):
diff --git a/testing/xvfb_unittest.py b/testing/xvfb_unittest.py index f28b6d2..4d0ab08 100755 --- a/testing/xvfb_unittest.py +++ b/testing/xvfb_unittest.py
@@ -16,6 +16,8 @@ import time import unittest +# pylint: disable=super-with-arguments + TEST_FILE = __file__.replace('.pyc', '.py') XVFB = TEST_FILE.replace('_unittest', '') @@ -29,11 +31,13 @@ stderr=subprocess.STDOUT, env=os.environ.copy()) +# pylint: disable=inconsistent-return-statements def read_subprocess_message(proc, starts_with): """Finds the value after first line prefix condition.""" - for line in proc.stdout: - if line.startswith(starts_with): + for line in proc.stdout.read().decode('utf-8').splitlines(True): + if str(line).startswith(starts_with): return line.rstrip().replace(starts_with, '') +# pylint: enable=inconsistent-return-statements def send_signal(proc, sig, sleep_time=0.3): @@ -47,7 +51,7 @@ def setUp(self): super(XvfbLinuxTest, self).setUp() - if sys.platform != 'linux2': + if not sys.platform.startswith('linux'): self.skipTest('linux only test') def test_no_xvfb_display(self): @@ -92,13 +96,13 @@ proc = launch_process(['--sleep']) send_signal(proc, signal.SIGINT, 1) sig = read_subprocess_message(proc, 'Signal :') - self.assertEqual(sig, str(signal.SIGINT)) + self.assertEqual(int(sig), int(signal.SIGINT)) def test_send_sigterm(self): proc = launch_process(['--sleep']) send_signal(proc, signal.SIGTERM, 1) sig = read_subprocess_message(proc, 'Signal :') - self.assertEqual(sig, str(signal.SIGTERM)) + self.assertEqual(int(sig), int(signal.SIGTERM)) if __name__ == '__main__': unittest.main()
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 51d668e..cd45fbb 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -443,11 +443,6 @@ #endif }; -// Freeze scheduler task queues in background on network idle. -// This feature only works if stop-in-background is enabled. -const base::Feature kFreezeBackgroundTabOnNetworkIdle{ - "freeze-background-tab-on-network-idle", base::FEATURE_DISABLED_BY_DEFAULT}; - // Enable the Storage Access API. https://crbug.com/989663. const base::Feature kStorageAccessAPI{"StorageAccessAPI", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 7fe2933..342f4e5 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -183,8 +183,6 @@ BLINK_COMMON_EXPORT extern const base::Feature kServiceWorkerUpdateDelay; BLINK_COMMON_EXPORT extern const base::Feature kSpeculationRulesPrefetchProxy; BLINK_COMMON_EXPORT extern const base::Feature kStopInBackground; -BLINK_COMMON_EXPORT extern const base::Feature - kFreezeBackgroundTabOnNetworkIdle; BLINK_COMMON_EXPORT extern const base::Feature kStorageAccessAPI; BLINK_COMMON_EXPORT extern const base::Feature kTextFragmentAnchor; BLINK_COMMON_EXPORT extern const base::Feature kCssSelectorFragmentAnchor;
diff --git a/third_party/blink/public/mojom/webauthn/authenticator.mojom b/third_party/blink/public/mojom/webauthn/authenticator.mojom index f9892ea..7dcedbf5 100644 --- a/third_party/blink/public/mojom/webauthn/authenticator.mojom +++ b/third_party/blink/public/mojom/webauthn/authenticator.mojom
@@ -43,6 +43,7 @@ CANNOT_READ_AND_WRITE_LARGE_BLOB, INVALID_ALLOW_CREDENTIALS_FOR_LARGE_BLOB, FAILED_TO_SAVE_CREDENTIAL_ID_FOR_PAYMENT_EXTENSION, + REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED, // ERROR_WITH_DOM_EXCEPTION_DETAILS indicates that the error will be // described in a `WebAuthnDOMExceptionDetails` structure.
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index b4e5357..82ac2796 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3705,6 +3705,29 @@ return false; } +// LayoutTable[Row,Section,Cell] all amend their ComputedStyle in response +// to StyleDidChange. Whenever we recalc the style of an element and find +// no difference, we still need to do ApplyStyleChanges::kYes to perform the +// amendment. +static bool ForceApplyForLegacyLayout(const ComputedStyle& new_style, + const LayoutObject& layout_object) { + // See LayoutTable[Section, Row]::StyleDidChange. + if (layout_object.IsLegacyTableRow() || + layout_object.IsLegacyTableSection()) { + if (new_style.HasInFlowPosition()) + return true; + } + // See LayoutTableCell::StyleDidChange. + if (layout_object.IsTableCellLegacy()) { + if (layout_object.Parent() && + new_style.GetWritingMode() != + layout_object.Parent()->StyleRef().GetWritingMode()) { + return true; + } + } + return false; +} + // This function performs two important tasks: // // 1. It computes the correct style for the element itself. @@ -3986,6 +4009,8 @@ if (layout_style->CompositablePaintAnimationChanged()) apply_changes = LayoutObject::ApplyStyleChanges::kYes; } + if (ForceApplyForLegacyLayout(*layout_style, *layout_object)) + apply_changes = LayoutObject::ApplyStyleChanges::kYes; layout_object->SetStyle(layout_style.get(), apply_changes); } return child_change;
diff --git a/third_party/blink/renderer/core/editing/commands/replace_selection_command_test.cc b/third_party/blink/renderer/core/editing/commands/replace_selection_command_test.cc index 750c393..5711721 100644 --- a/third_party/blink/renderer/core/editing/commands/replace_selection_command_test.cc +++ b/third_party/blink/renderer/core/editing/commands/replace_selection_command_test.cc
@@ -92,8 +92,8 @@ ComputedStyle::Clone(layout_object->StyleRef()); modified_style->SetTextAutosizingMultiplier(multiplier); EXPECT_EQ(multiplier, modified_style->TextAutosizingMultiplier()); - layout_object->SetModifiedStyleOutsideStyleRecalc( - std::move(modified_style), LayoutObject::ApplyStyleChanges::kNo); + layout_object->SetStyle(std::move(modified_style), + LayoutObject::ApplyStyleChanges::kNo); multiplier_set = true; } }
diff --git a/third_party/blink/renderer/core/frame/attribution_response_parsing.cc b/third_party/blink/renderer/core/frame/attribution_response_parsing.cc index 220cea7c..095f1a1 100644 --- a/third_party/blink/renderer/core/frame/attribution_response_parsing.cc +++ b/third_party/blink/renderer/core/frame/attribution_response_parsing.cc
@@ -11,6 +11,7 @@ #include "base/check.h" #include "base/memory/scoped_refptr.h" +#include "base/metrics/histogram_macros.h" #include "base/time/time.h" #include "third_party/abseil-cpp/absl/numeric/int128.h" #include "third_party/blink/public/common/attribution_reporting/constants.h" @@ -81,10 +82,24 @@ if (!object) return false; + const int kExclusiveMaxHistogramValue = 101; + + static_assert(kMaxValuesPerAttributionFilter < kExclusiveMaxHistogramValue, + "Bump the version for histogram Conversions.ValuesPerFilter"); + + static_assert( + kMaxAttributionFiltersPerSource < kExclusiveMaxHistogramValue, + "Bump the version for histogram Conversions.FiltersPerFilterData"); + const wtf_size_t num_filters = object->size(); if (num_filters > kMaxAttributionFiltersPerSource) return false; + // The metrics are called potentially many times while parsing an attribution + // header, therefore using the macros to avoid the overhead of taking a lock + // and performing a map lookup. + UMA_HISTOGRAM_COUNTS_100("Conversions.FiltersPerFilterData", num_filters); + for (wtf_size_t i = 0; i < num_filters; ++i) { JSONObject::Entry entry = object->at(i); @@ -101,6 +116,8 @@ if (num_values > kMaxValuesPerAttributionFilter) return false; + UMA_HISTOGRAM_COUNTS_100("Conversions.ValuesPerFilter", num_values); + WTF::Vector<String> values; for (wtf_size_t j = 0; j < num_values; ++j) {
diff --git a/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc b/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc index 5d00535..682d23b 100644 --- a/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc +++ b/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc
@@ -5,9 +5,11 @@ #include "third_party/blink/renderer/core/frame/attribution_response_parsing.h" #include <limits> +#include <memory> #include <string> #include <utility> +#include "base/test/metrics/histogram_tester.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/numeric/int128.h" #include "third_party/blink/public/common/attribution_reporting/constants.h" @@ -1205,4 +1207,61 @@ } } +TEST(AttributionResponseParsingTest, FilterValuesHistogram) { + const auto make_filter_data = [](wtf_size_t n) { + auto array = std::make_unique<JSONArray>(); + for (wtf_size_t i = 0; i < n; ++i) { + array->PushString("x"); + } + + JSONObject object; + object.SetArray("a", std::move(array)); + return object.ToJSONString(); + }; + + const struct { + wtf_size_t size; + bool expected; + } kTestCases[] = { + {0, true}, + {kMaxValuesPerAttributionFilter, true}, + {kMaxValuesPerAttributionFilter + 1, false}, + }; + + for (const auto& test_case : kTestCases) { + base::HistogramTester histograms; + mojom::blink::AttributionFilterData filter_data; + ParseFilters(make_filter_data(test_case.size), filter_data); + histograms.ExpectUniqueSample("Conversions.ValuesPerFilter", test_case.size, + test_case.expected); + } +} + +TEST(AttributionResponseParsingTest, FiltersSizeHistogram) { + const auto make_filter_data = [](wtf_size_t n) { + JSONObject object; + for (wtf_size_t i = 0; i < n; ++i) { + object.SetArray(String::Number(i), std::make_unique<JSONArray>()); + } + return object.ToJSONString(); + }; + + const struct { + wtf_size_t size; + bool expected; + } kTestCases[] = { + {0, true}, + {kMaxAttributionFiltersPerSource, true}, + {kMaxAttributionFiltersPerSource + 1, false}, + }; + + for (const auto& test_case : kTestCases) { + base::HistogramTester histograms; + mojom::blink::AttributionFilterData filter_data; + ParseFilters(make_filter_data(test_case.size), filter_data); + histograms.ExpectUniqueSample("Conversions.FiltersPerFilterData", + test_case.size, test_case.expected); + } +} + } // namespace blink::attribution_response_parsing
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc index 40e0b1e..2056456 100644 --- a/third_party/blink/renderer/core/frame/web_frame_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -1601,8 +1601,8 @@ ComputedStyle::Clone(layout_object->StyleRef()); modified_style->SetTextAutosizingMultiplier(multiplier); EXPECT_EQ(multiplier, modified_style->TextAutosizingMultiplier()); - layout_object->SetModifiedStyleOutsideStyleRecalc( - std::move(modified_style), LayoutObject::ApplyStyleChanges::kNo); + layout_object->SetStyle(std::move(modified_style), + LayoutObject::ApplyStyleChanges::kNo); multiplier_set = true; } }
diff --git a/third_party/blink/renderer/core/html/forms/select_type.cc b/third_party/blink/renderer/core/html/forms/select_type.cc index 4d4f832..527bf56 100644 --- a/third_party/blink/renderer/core/html/forms/select_type.cc +++ b/third_party/blink/renderer/core/html/forms/select_type.cc
@@ -498,8 +498,8 @@ cloned_style->SetUnicodeBidi(option_style->GetUnicodeBidi()); cloned_style->SetTextAlign(option_style->GetTextAlign(true)); if (auto* inner_layout = inner_element.GetLayoutObject()) { - inner_layout->SetModifiedStyleOutsideStyleRecalc( - std::move(cloned_style), LayoutObject::ApplyStyleChanges::kYes); + inner_layout->SetStyle(std::move(cloned_style), + LayoutObject::ApplyStyleChanges::kYes); } else { inner_element.SetComputedStyle(std::move(cloned_style)); }
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.cc b/third_party/blink/renderer/core/html/parser/html_document_parser.cc index a9c6b908..051a646 100644 --- a/third_party/blink/renderer/core/html/parser/html_document_parser.cc +++ b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
@@ -403,10 +403,10 @@ ? Thread::Current()->Scheduler() : nullptr) { // Report metrics for async document parsing or forced synchronous parsing. - // The document must be main frame to meet UKM requirements, and must have a - // high resolution clock for high quality data. - if (sync_policy == kAllowDeferredParsing && document.GetFrame() && - document.GetFrame()->IsMainFrame() && + // The document must be outermost main frame to meet UKM requirements, and + // must have a high resolution clock for high quality data. + if (sync_policy == kAllowDeferredParsing && + document.IsInOutermostMainFrame() && base::TimeTicks::IsHighResolution()) { metrics_reporter_ = std::make_unique<HTMLParserMetrics>( document.UkmSourceID(), document.UkmRecorder()); @@ -1311,10 +1311,10 @@ } std::string HTMLDocumentParser::GetPreloadHistogramSuffix() { - bool is_main_frame = GetDocument() && GetDocument()->GetFrame() && - GetDocument()->GetFrame()->IsMainFrame(); + bool is_outermost_main_frame = + GetDocument() && GetDocument()->IsInOutermostMainFrame(); bool have_seen_first_byte = task_runner_state_->SeenFirstByte(); - return base::StrCat({is_main_frame ? ".MainFrame" : ".Subframe", + return base::StrCat({is_outermost_main_frame ? ".MainFrame" : ".Subframe", have_seen_first_byte ? ".NonInitial" : ".Initial"}); }
diff --git a/third_party/blink/renderer/core/input/overscroll_behavior_test.cc b/third_party/blink/renderer/core/input/overscroll_behavior_test.cc index 98fbfd6..73d7722 100644 --- a/third_party/blink/renderer/core/input/overscroll_behavior_test.cc +++ b/third_party/blink/renderer/core/input/overscroll_behavior_test.cc
@@ -66,8 +66,8 @@ ComputedStyle::Clone(*inner->GetComputedStyle()); modified_style->SetOverscrollBehaviorX(x); modified_style->SetOverscrollBehaviorY(y); - inner->GetLayoutObject()->SetModifiedStyleOutsideStyleRecalc( - std::move(modified_style), LayoutObject::ApplyStyleChanges::kNo); + inner->GetLayoutObject()->SetStyle(std::move(modified_style), + LayoutObject::ApplyStyleChanges::kNo); } void OverscrollBehaviorTest::ScrollBegin(double hint_x, double hint_y) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc index bc92ad0..1c71596e 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -1339,7 +1339,8 @@ v8::Local<v8::Value> v8_method; if (!GetV8Property(context, context->Global(), "dispatch") - .ToLocal(&v8_method)) { + .ToLocal(&v8_method) || + v8_method->IsUndefined()) { return; }
diff --git a/third_party/blink/renderer/core/layout/layout_block_test.cc b/third_party/blink/renderer/core/layout/layout_block_test.cc index 441a22cb..30dbcf4 100644 --- a/third_party/blink/renderer/core/layout/layout_block_test.cc +++ b/third_party/blink/renderer/core/layout/layout_block_test.cc
@@ -25,8 +25,7 @@ GetDocument().GetStyleResolver().CreateComputedStyle(); LayoutObject* obj = LayoutBlockFlow::CreateAnonymous(&GetDocument(), style, LegacyLayout::kAuto); - obj->SetModifiedStyleOutsideStyleRecalc(nullptr, - LayoutObject::ApplyStyleChanges::kNo); + obj->SetStyle(nullptr, LayoutObject::ApplyStyleChanges::kNo); EXPECT_FALSE(obj->Style()); EXPECT_THAT(obj->DecoratedName().Ascii(), MatchesRegex("LayoutN?G?BlockFlow \\(anonymous\\)"));
diff --git a/third_party/blink/renderer/core/layout/layout_list_item.cc b/third_party/blink/renderer/core/layout/layout_list_item.cc index f74828e..826cc78 100644 --- a/third_party/blink/renderer/core/layout/layout_list_item.cc +++ b/third_party/blink/renderer/core/layout/layout_list_item.cc
@@ -238,8 +238,8 @@ scoped_refptr<ComputedStyle> new_style = ComputedStyle::Clone(layout_object.StyleRef()); new_style->SetLogicalHeight(height); - layout_object.SetModifiedStyleOutsideStyleRecalc( - std::move(new_style), LayoutObject::ApplyStyleChanges::kNo); + layout_object.SetStyle(std::move(new_style), + LayoutObject::ApplyStyleChanges::kNo); } } // namespace
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index faf44299..50f90a3 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -5060,7 +5060,7 @@ return outline_rects; } -void LayoutObject::SetModifiedStyleOutsideStyleRecalc( +void LayoutObject::SetTextAutoSizedStyle( scoped_refptr<const ComputedStyle> style, ApplyStyleChanges apply_changes) { NOT_DESTROYED();
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 42cb3a8..6b5f132 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2337,18 +2337,8 @@ void SetPseudoElementStyle(scoped_refptr<const ComputedStyle>, bool match_parent_size = false); - // In some cases we modify the ComputedStyle after the style recalc, either - // for updating anonymous style or doing layout hacks for special elements - // where we update the ComputedStyle during layout. - // If the LayoutObject has an associated node, we will SetComputedStyle on - // that node with the new ComputedStyle. - // ApplyStyleChanges = kNo means we will simply set the member object. If it's - // kYes, we will apply any changes from the previously set ComputedStyle to do - // visual invalidation etc. - // - // Do not use unless strictly necessary. - void SetModifiedStyleOutsideStyleRecalc(scoped_refptr<const ComputedStyle>, - ApplyStyleChanges); + void SetTextAutoSizedStyle(scoped_refptr<const ComputedStyle>, + ApplyStyleChanges); // This function returns an enclosing non-anonymous LayoutBlock for this // element. This function is not always returning the containing block as
diff --git a/third_party/blink/renderer/core/layout/layout_table_cell.cc b/third_party/blink/renderer/core/layout/layout_table_cell.cc index 13735af..f7fda0ec 100644 --- a/third_party/blink/renderer/core/layout/layout_table_cell.cc +++ b/third_party/blink/renderer/core/layout/layout_table_cell.cc
@@ -465,8 +465,7 @@ scoped_refptr<ComputedStyle> new_style = ComputedStyle::Clone(StyleRef()); new_style->SetWritingMode(row->StyleRef().GetWritingMode()); new_style->UpdateFontOrientation(); - SetModifiedStyleOutsideStyleRecalc(new_style, - LayoutObject::ApplyStyleChanges::kNo); + SetStyle(new_style, LayoutObject::ApplyStyleChanges::kNo); SetHorizontalWritingMode(StyleRef().IsHorizontalWritingMode()); UnmarkOrthogonalWritingModeRoot();
diff --git a/third_party/blink/renderer/core/layout/layout_table_row.cc b/third_party/blink/renderer/core/layout/layout_table_row.cc index d97ee3c..3c7c626 100644 --- a/third_party/blink/renderer/core/layout/layout_table_row.cc +++ b/third_party/blink/renderer/core/layout/layout_table_row.cc
@@ -71,8 +71,7 @@ if (StyleRef().HasInFlowPosition()) { scoped_refptr<ComputedStyle> new_style = ComputedStyle::Clone(StyleRef()); new_style->SetPosition(EPosition::kStatic); - SetModifiedStyleOutsideStyleRecalc(new_style, - LayoutObject::ApplyStyleChanges::kNo); + SetStyle(new_style, LayoutObject::ApplyStyleChanges::kNo); } LayoutTableBoxComponent::StyleDidChange(diff, old_style);
diff --git a/third_party/blink/renderer/core/layout/layout_table_section.cc b/third_party/blink/renderer/core/layout/layout_table_section.cc index 193d3848..43a7631 100644 --- a/third_party/blink/renderer/core/layout/layout_table_section.cc +++ b/third_party/blink/renderer/core/layout/layout_table_section.cc
@@ -126,8 +126,7 @@ if (StyleRef().HasInFlowPosition()) { scoped_refptr<ComputedStyle> new_style = ComputedStyle::Clone(StyleRef()); new_style->SetPosition(EPosition::kStatic); - SetModifiedStyleOutsideStyleRecalc(new_style, - LayoutObject::ApplyStyleChanges::kNo); + SetStyle(new_style, LayoutObject::ApplyStyleChanges::kNo); } LayoutTableBoxComponent::StyleDidChange(diff, old_style);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder_test.cc index 31c245eb..0f11ca8 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder_test.cc
@@ -489,8 +489,7 @@ document->GetStyleResolver().CreateComputedStyle()); initialize_style(style.get()); LayoutInline* const node = LayoutInline::CreateAnonymous(document); - node->SetModifiedStyleOutsideStyleRecalc( - std::move(style), LayoutObject::ApplyStyleChanges::kNo); + node->SetStyle(std::move(style), LayoutObject::ApplyStyleChanges::kNo); node->SetIsInLayoutNGInlineFormattingContext(true); return node; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc index 9dcfab3c..3916f83 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
@@ -69,8 +69,8 @@ DCHECK(element->GetLayoutObject()); scoped_refptr<ComputedStyle> mutable_style = ComputedStyle::Clone(element->GetLayoutObject()->StyleRef()); - element->GetLayoutObject()->SetModifiedStyleOutsideStyleRecalc( - mutable_style, LayoutObject::ApplyStyleChanges::kNo); + element->GetLayoutObject()->SetStyle(mutable_style, + LayoutObject::ApplyStyleChanges::kNo); return mutable_style; } };
diff --git a/third_party/blink/renderer/core/layout/text_autosizer.cc b/third_party/blink/renderer/core/layout/text_autosizer.cc index 1786e8c..0e3169a 100644 --- a/third_party/blink/renderer/core/layout/text_autosizer.cc +++ b/third_party/blink/renderer/core/layout/text_autosizer.cc
@@ -1258,7 +1258,7 @@ else DCHECK(false); - layout_object->SetModifiedStyleOutsideStyleRecalc( + layout_object->SetTextAutoSizedStyle( std::move(style), LayoutObject::ApplyStyleChanges::kNo); if (layout_object->IsText()) To<LayoutText>(layout_object)->AutosizingMultiplerChanged(); @@ -1270,7 +1270,7 @@ case kLayoutNeeded: DCHECK(!layouter); - layout_object->SetModifiedStyleOutsideStyleRecalc( + layout_object->SetTextAutoSizedStyle( std::move(style), LayoutObject::ApplyStyleChanges::kYes); break; }
diff --git a/third_party/blink/renderer/core/loader/idleness_detector.cc b/third_party/blink/renderer/core/loader/idleness_detector.cc index 3383250..67327e38 100644 --- a/third_party/blink/renderer/core/loader/idleness_detector.cc +++ b/third_party/blink/renderer/core/loader/idleness_detector.cc
@@ -158,12 +158,6 @@ } FirstMeaningfulPaintDetector::From(*local_frame_->GetDocument()) .OnNetwork2Quiet(); - if (local_frame_->IsMainFrame()) { - if (Page* page = local_frame_->GetPage()) { - if (PageScheduler* scheduler = page->GetPageScheduler()) - scheduler->OnLocalMainFrameNetworkAlmostIdle(); - } - } in_network_2_quiet_period_ = false; network_2_quiet_ = base::TimeTicks(); }
diff --git a/third_party/blink/renderer/core/page/create_window.cc b/third_party/blink/renderer/core/page/create_window.cc index 30af2646..a22f050 100644 --- a/third_party/blink/renderer/core/page/create_window.cc +++ b/third_party/blink/renderer/core/page/create_window.cc
@@ -27,11 +27,9 @@ #include "third_party/blink/renderer/core/page/create_window.h" #include "base/feature_list.h" -#include "base/metrics/histogram_macros.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/common/frame/from_ad_state.h" #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h" #include "third_party/blink/public/web/web_view_client.h" #include "third_party/blink/public/web/web_window_features.h" @@ -239,11 +237,6 @@ bool is_ad_subframe = opener_frame.IsAdSubframe(); bool is_ad_script_in_stack = ad_tracker->IsAdScriptInStack(AdTracker::StackType::kBottomAndTop); - FromAdState state = - blink::GetFromAdState(is_ad_subframe, is_ad_script_in_stack); - - // Log to UMA. - UMA_HISTOGRAM_ENUMERATION("Blink.WindowOpen.FromAdState", state); // Log to UKM. ukm::UkmRecorder* ukm_recorder = opener_frame.GetDocument()->UkmRecorder();
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc index ea008c7..333ac692 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
@@ -477,6 +477,11 @@ DOMExceptionCode::kNotReadableError, "Failed to save the credential identifier for the 'payment' " "extension."); + case AuthenticatorStatus::REMOTE_DESKTOP_CLIENT_OVERRIDE_NOT_AUTHORIZED: + return MakeGarbageCollected<DOMException>( + DOMExceptionCode::kNotAllowedError, + "This origin is not permitted to use the " + "'remoteDesktopClientOverride' extension."); case AuthenticatorStatus::ERROR_WITH_DOM_EXCEPTION_DETAILS: return DOMException::Create( /*message=*/dom_exception_details->message,
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h index 32eb7ef..44b96b4 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h +++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h
@@ -183,6 +183,10 @@ is_screencast_ = is_screencast; } + MediaStreamTrackPlatform::StreamType Type() const override { + return MediaStreamTrackPlatform::StreamType::kVideo; + }; + private: FRIEND_TEST_ALL_PREFIXES(MediaStreamRemoteVideoSourceTest, StartTrack); FRIEND_TEST_ALL_PREFIXES(MediaStreamRemoteVideoSourceTest, RemoteTrackStop);
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h b/third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h index 02fc4f23..808cf803 100644 --- a/third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h +++ b/third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h
@@ -101,6 +101,10 @@ // be delivered to the sinks instead of the content of |audio_bus|. void OnData(const media::AudioBus& audio_bus, base::TimeTicks reference_time); + MediaStreamTrackPlatform::StreamType Type() const override { + return MediaStreamTrackPlatform::StreamType::kAudio; + }; + private: // In debug builds, check that all methods that could cause object graph // or data flow changes are being called on the main thread.
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_component.cc b/third_party/blink/renderer/platform/mediastream/media_stream_component.cc index 8cfb4a84..fe99dafc 100644 --- a/third_party/blink/renderer/platform/mediastream/media_stream_component.cc +++ b/third_party/blink/renderer/platform/mediastream/media_stream_component.cc
@@ -44,6 +44,23 @@ static int g_unique_media_stream_component_id = 0; +void CheckSourceAndTrackSameType( + const MediaStreamSource* source, + const MediaStreamTrackPlatform* platform_track) { + // Ensure the source and platform_track have the same types. + switch (source->GetType()) { + case MediaStreamSource::kTypeAudio: + CHECK(platform_track->Type() == + MediaStreamTrackPlatform::StreamType::kAudio); + return; + case MediaStreamSource::kTypeVideo: + CHECK(platform_track->Type() == + MediaStreamTrackPlatform::StreamType::kVideo); + return; + } + NOTREACHED(); +} + } // namespace // static @@ -66,6 +83,12 @@ MediaStreamSource* source, std::unique_ptr<MediaStreamTrackPlatform> platform_track) : MediaStreamComponent(id, source) { + // TODO(https://crbug.com/1302689): Change to a DCHECK(platform_track) once + // all callers provide a platform_track here, rather than using + // SetPlatformTrack(). + if (platform_track) { + CheckSourceAndTrackSameType(source, platform_track.get()); + } platform_track_ = std::move(platform_track); } @@ -73,6 +96,12 @@ MediaStreamSource* source, std::unique_ptr<MediaStreamTrackPlatform> platform_track) : MediaStreamComponent(source) { + // TODO(https://crbug.com/1302689): Change to a DCHECK(platform_track) once + // all callers provide a platform_track here, rather than using + // SetPlatformTrack(). + if (platform_track) { + CheckSourceAndTrackSameType(source, platform_track.get()); + } platform_track_ = std::move(platform_track); }
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h b/third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h index b705907..cc9a4ec 100644 --- a/third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h +++ b/third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h
@@ -86,6 +86,9 @@ bool is_local_track() const { return is_local_track_; } + enum class StreamType { kAudio, kVideo }; + virtual StreamType Type() const = 0; + private: const bool is_local_track_; };
diff --git a/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc b/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc index 23c2b00f..e6f1128b 100644 --- a/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc +++ b/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc
@@ -132,7 +132,6 @@ void SetPageBackForwardCached(bool) override {} bool IsMainFrameLocal() const override { return true; } void SetIsMainFrameLocal(bool) override {} - void OnLocalMainFrameNetworkAlmostIdle() override {} void AudioStateChanged(bool is_audio_playing) override {} bool IsAudioPlaying() const override { return false; } bool IsExemptFromBudgetBasedThrottling() const override { return false; }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc index f8b799b..0f8d6f6da 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
@@ -53,14 +53,6 @@ constexpr base::TimeDelta kDefaultDelayForBackgroundTabFreezing = base::Minutes(5); -// The amount of time to wait before checking network idleness -// after the page has been backgrounded. If network is idle, -// suspend shared timers, and loading etc. This is used only if -// freeze-background-tab-on-network-idle feature is enabled. -// This value should be smaller than kDefaultDelayForBackgroundTabFreezing. -constexpr base::TimeDelta kDefaultDelayForBackgroundAndNetworkIdleTabFreezing = - base::Minutes(1); - // Duration of a throttled wake up. constexpr base::TimeDelta kThrottledWakeUpDuration = base::Milliseconds(3); @@ -137,17 +129,6 @@ return base::Milliseconds(kDelayForBackgroundTabFreezingMillis.Get()); } -base::TimeDelta GetDelayForBackgroundAndNetworkIdleTabFreezing() { - static const base::FeatureParam<int> - kDelayForBackgroundAndNetworkIdleTabFreezingMillis{ - &features::kFreezeBackgroundTabOnNetworkIdle, - "DelayForBackgroundAndNetworkIdleTabFreezingMills", - static_cast<int>(kDefaultDelayForBackgroundAndNetworkIdleTabFreezing - .InMilliseconds())}; - return base::Milliseconds( - kDelayForBackgroundAndNetworkIdleTabFreezingMillis.Get()); -} - base::TimeDelta GetTimeToDelayIPCTrackingWhileStoredInBackForwardCache() { if (base::FeatureList::IsEnabled( features::kLogUnexpectedIPCPostedToBackForwardCachedDocuments)) { @@ -186,10 +167,6 @@ had_recent_title_or_favicon_update_(false), delegate_(delegate), delay_for_background_tab_freezing_(GetDelayForBackgroundTabFreezing()), - freeze_on_network_idle_enabled_(base::FeatureList::IsEnabled( - blink::features::kFreezeBackgroundTabOnNetworkIdle)), - delay_for_background_and_network_idle_tab_freezing_( - GetDelayForBackgroundAndNetworkIdleTabFreezing()), throttle_foreground_timers_( base::FeatureList::IsEnabled(features::kThrottleForegroundTimers)), foreground_timers_throttled_wake_up_interval_( @@ -449,9 +426,7 @@ if (ShouldFreezePage()) { main_thread_scheduler_->ControlTaskRunner()->PostDelayedTask( FROM_HERE, do_freeze_page_callback_.GetCallback(), - freeze_on_network_idle_enabled_ - ? delay_for_background_and_network_idle_tab_freezing_ - : delay_for_background_tab_freezing_); + delay_for_background_tab_freezing_); } } @@ -713,9 +688,7 @@ if (ShouldFreezePage()) { main_thread_scheduler_->ControlTaskRunner()->PostDelayedTask( FROM_HERE, do_freeze_page_callback_.GetCallback(), - freeze_on_network_idle_enabled_ - ? delay_for_background_and_network_idle_tab_freezing_ - : delay_for_background_tab_freezing_); + delay_for_background_tab_freezing_); } else { SetPageFrozenImpl(false, NotificationPolicy::kDoNotNotifyFrames); } @@ -854,46 +827,9 @@ return IsBackgrounded(); } -void PageSchedulerImpl::OnLocalMainFrameNetworkAlmostIdle() { - if (!freeze_on_network_idle_enabled_) - return; - - if (!ShouldFreezePage()) - return; - - if (IsFrozen()) - return; - - // If delay_for_background_and_network_idle_tab_freezing_ passes after - // the page is not visible, we should freeze the page. - base::TimeDelta passed = - main_thread_scheduler_->NowTicks() - page_visibility_changed_time_; - if (passed < delay_for_background_and_network_idle_tab_freezing_) - return; - - SetPageFrozenImpl(true, NotificationPolicy::kNotifyFrames); -} - void PageSchedulerImpl::DoFreezePage() { DCHECK(ShouldFreezePage()); - if (freeze_on_network_idle_enabled_) { - DCHECK(delegate_); - base::TimeDelta passed = - main_thread_scheduler_->NowTicks() - page_visibility_changed_time_; - // The page will be frozen if: - // (1) the main frame is remote, or, - // (2) the local main frame's network is almost idle, or, - // (3) delay_for_background_tab passes after the page is not visible. - if (!delegate_->LocalMainFrameNetworkIsAlmostIdle() && - passed < delay_for_background_tab_freezing_) { - main_thread_scheduler_->ControlTaskRunner()->PostDelayedTask( - FROM_HERE, do_freeze_page_callback_.GetCallback(), - delay_for_background_tab_freezing_ - passed); - return; - } - } - SetPageFrozenImpl(true, NotificationPolicy::kNotifyFrames); }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h index 927658bd..d9add637 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h
@@ -70,7 +70,6 @@ void SetPageBackForwardCached(bool) override; bool IsMainFrameLocal() const override; void SetIsMainFrameLocal(bool is_local) override; - void OnLocalMainFrameNetworkAlmostIdle() override; base::TimeTicks GetStoredInBackForwardCacheTimestamp() { return stored_in_back_forward_cache_timestamp_; } @@ -362,13 +361,6 @@ CancelableClosureHolder do_freeze_page_callback_; const base::TimeDelta delay_for_background_tab_freezing_; - // Whether a background page can be frozen before - // |delay_for_background_tab_freezing_| if network is idle. - const bool freeze_on_network_idle_enabled_; - - // Delay after which a background page can be frozen if network is idle. - const base::TimeDelta delay_for_background_and_network_idle_tab_freezing_; - // Whether foreground timers should be always throttled. const bool throttle_foreground_timers_; // Interval between throttled wake ups on a foreground page.
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc index 919f826..7fd40db 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
@@ -79,18 +79,13 @@ class MockPageSchedulerDelegate : public PageScheduler::Delegate { public: - MockPageSchedulerDelegate() : idle_(false) {} - - void SetLocalMainFrameNetworkIsAlmostIdle(bool idle) { idle_ = idle; } - bool LocalMainFrameNetworkIsAlmostIdle() const override { return idle_; } + MockPageSchedulerDelegate() {} private: void ReportIntervention(const WTF::String&) override {} bool RequestBeginMainFrameNotExpected(bool) override { return false; } void OnSetPageFrozen(bool is_frozen) override {} bool IsOrdinary() const override { return true; } - - bool idle_; }; class PageSchedulerImplTest : public testing::Test { @@ -151,10 +146,6 @@ return page_scheduler_->delay_for_background_tab_freezing_; } - base::TimeDelta delay_for_background_and_network_idle_tab_freezing() const { - return page_scheduler_->delay_for_background_and_network_idle_tab_freezing_; - } - PageScheduler::Delegate* delegate() { return page_scheduler_->delegate_; } static base::TimeDelta recent_audio_delay() { @@ -263,16 +254,6 @@ EXPECT_EQ(5, counter); } - bool NetworkIsAlmostIdle() const { - return page_scheduler_delegate_->LocalMainFrameNetworkIsAlmostIdle(); - } - - void NotifyLocalMainFrameNetworkIsAlmostIdle() { - EXPECT_FALSE(page_scheduler_delegate_->LocalMainFrameNetworkIsAlmostIdle()); - page_scheduler_delegate_->SetLocalMainFrameNetworkIsAlmostIdle(true); - page_scheduler_->OnLocalMainFrameNetworkAlmostIdle(); - } - scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner_; std::unique_ptr<MainThreadSchedulerImpl> scheduler_; std::unique_ptr<WebAgentGroupScheduler> agent_group_scheduler_; @@ -1477,91 +1458,6 @@ EXPECT_FALSE(page_scheduler_->IsFrozen()); } -class PageSchedulerImplFreezeBackgroundTabOnNetworkIdleEnabledTest - : public PageSchedulerImplTest { - public: - PageSchedulerImplFreezeBackgroundTabOnNetworkIdleEnabledTest() - : PageSchedulerImplTest( - {blink::features::kStopInBackground, - blink::features::kFreezeBackgroundTabOnNetworkIdle}, - {}) {} -}; - -TEST_F(PageSchedulerImplFreezeBackgroundTabOnNetworkIdleEnabledTest, - PageFrozenOnlyOnLocalMainFrameNetworkIdle) { - page_scheduler_->SetPageVisible(true); - EXPECT_FALSE(ShouldFreezePage()); - EXPECT_FALSE(page_scheduler_->IsFrozen()); - EXPECT_FALSE(NetworkIsAlmostIdle()); - - // After network is idle, page should freeze after delay for quick - // background tab freezing. - NotifyLocalMainFrameNetworkIsAlmostIdle(); - EXPECT_TRUE(NetworkIsAlmostIdle()); - EXPECT_FALSE(page_scheduler_->IsFrozen()); - page_scheduler_->SetPageVisible(false); - test_task_runner_->FastForwardBy( - delay_for_background_and_network_idle_tab_freezing() + - base::Milliseconds(100)); - EXPECT_TRUE(page_scheduler_->IsFrozen()); -} - -TEST_F(PageSchedulerImplFreezeBackgroundTabOnNetworkIdleEnabledTest, - PageFrozenOnlyOnLocalMainFrameNetworkAlmostIdleNoRegress) { - page_scheduler_->SetPageVisible(true); - EXPECT_FALSE(ShouldFreezePage()); - EXPECT_FALSE(page_scheduler_->IsFrozen()); - EXPECT_FALSE(NetworkIsAlmostIdle()); - - // Page should freeze after delay for background tab freezing. - page_scheduler_->SetPageVisible(false); - EXPECT_TRUE(ShouldFreezePage()); - test_task_runner_->FastForwardBy(delay_for_background_tab_freezing() + - base::Milliseconds(100)); - EXPECT_TRUE(page_scheduler_->IsFrozen()); -} - -TEST_F(PageSchedulerImplFreezeBackgroundTabOnNetworkIdleEnabledTest, - PageFrozenWhenNetworkIdleAfterQuickFreezingDelay) { - page_scheduler_->SetPageVisible(true); - EXPECT_FALSE(ShouldFreezePage()); - EXPECT_FALSE(page_scheduler_->IsFrozen()); - EXPECT_FALSE(NetworkIsAlmostIdle()); - - page_scheduler_->SetPageVisible(false); - EXPECT_TRUE(ShouldFreezePage()); - test_task_runner_->FastForwardBy( - delay_for_background_and_network_idle_tab_freezing() + - base::Milliseconds(100)); - EXPECT_FALSE(page_scheduler_->IsFrozen()); - - NotifyLocalMainFrameNetworkIsAlmostIdle(); - test_task_runner_->FastForwardBy(base::Milliseconds(100)); - EXPECT_TRUE(page_scheduler_->IsFrozen()); -} - -TEST_F(PageSchedulerImplFreezeBackgroundTabOnNetworkIdleEnabledTest, - PageNotFrozenWhenVisibleBeforeNetworkIdle) { - page_scheduler_->SetPageVisible(true); - EXPECT_FALSE(ShouldFreezePage()); - EXPECT_FALSE(page_scheduler_->IsFrozen()); - EXPECT_FALSE(NetworkIsAlmostIdle()); - - page_scheduler_->SetPageVisible(false); - EXPECT_TRUE(ShouldFreezePage()); - test_task_runner_->FastForwardBy( - delay_for_background_and_network_idle_tab_freezing() + - base::Milliseconds(100)); - EXPECT_FALSE(page_scheduler_->IsFrozen()); - - // Page should not freeze after delay for background tab freezing, because - // the page is visible. - page_scheduler_->SetPageVisible(true); - EXPECT_FALSE(ShouldFreezePage()); - test_task_runner_->FastForwardBy(delay_for_background_tab_freezing()); - EXPECT_FALSE(page_scheduler_->IsFrozen()); -} - class PageSchedulerImplPageTransitionTest : public PageSchedulerImplTest { public: typedef PageSchedulerImpl::PageLifecycleStateTransition Transition;
diff --git a/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h index fdd08e4..8c4cedc 100644 --- a/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h
@@ -54,9 +54,6 @@ // Whether the main frame of this page is local or not (remote). virtual bool IsMainFrameLocal() const = 0; virtual void SetIsMainFrameLocal(bool) = 0; - // Invoked when the local main frame's network becomes almost idle. - // Never invoked if the main frame is remote. - virtual void OnLocalMainFrameNetworkAlmostIdle() = 0; // Whether the main frame of this page is in BackForwardCache or not. virtual bool IsInBackForwardCache() const = 0;
diff --git a/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h b/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h index b4b29b1..012e90f 100644 --- a/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h
@@ -59,7 +59,6 @@ void SetPageBackForwardCached(bool) override {} bool IsMainFrameLocal() const override { return true; } void SetIsMainFrameLocal(bool is_local) override {} - void OnLocalMainFrameNetworkAlmostIdle() override {} std::unique_ptr<FrameScheduler> CreateFrameScheduler( FrameScheduler::Delegate* delegate,
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 271e9a2..34ed594 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -7761,3 +7761,5 @@ # Sheriff 2022-05-04 crbug.com/1309533 [ Win ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/idlharness.html [ Failure ] + +crbug.com/1320290 http/tests/devtools/storage-panel-dom-storage-update.js [ Skip ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-elements-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-elements-002-ref.html index 66bddf3..9dc6c57 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-elements-002-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-elements-002-ref.html
@@ -12,3 +12,5 @@ <div style="color:green">PASS if text is green.</div> <div style="color:green">PASS if text is green.</div> <div style="color:green">PASS if text is green.</div> +<div style="color:green">PASS if text is green.</div> +<div style="color:green">PASS if text is green.</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-elements-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-elements-002.html index 4563e63..9c4a6d2 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-elements-002.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-elements-002.html
@@ -28,6 +28,10 @@ @container (min-width: 400px) { #c11::first-line { color: green } } @container (min-width: 400px) { #c12::first-line { color: green } } + + #c13::first-line { color: red } + @container (min-width: 400px) { #c13::first-line { color: green } } + @container (min-width: 400px) { #c14::first-line { color: green } } </style> <div id="c1" class="container" style="width:100px"></div> <div id="c2" class="container" style="width:200px"></div> @@ -57,6 +61,8 @@ <div id="c12" class="container" style="width:300px"> <div class="container" style="width:300px">PASS if text is green.</div> </div> +<div id="c13" class="container" style="width:300px">PASS if text is green.</div> +<div id="c14" class="container" style="width:300px">PASS if text is green.</div> <script> document.body.offsetTop; c2.style.width = "100px"; @@ -65,4 +71,6 @@ c8.style.width = "400px"; c10.style.width = "300px"; c12.style.width = "400px"; + c13.style.width = "400px"; + c14.style.width = "400px"; </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/table-cell-writing-mode-computed.html b/third_party/blink/web_tests/external/wpt/css/css-tables/table-cell-writing-mode-computed.html new file mode 100644 index 0000000..28e9db2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/table-cell-writing-mode-computed.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<title>Computed value of orthogonal writing-mode on table cell</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<link rel="help" href="https://www.w3.org/TR/css-tables-3"> +<link rel="help" href="https://crbug.com/1307976"> +<style> + td { + writing-mode: vertical-lr; + } +</style> + +<table> + <tr> + <td>Test</td> + </tr> +</table> + +<script> + test(() => { + let td = document.querySelector('td'); + assert_equals(getComputedStyle(td).writingMode, 'vertical-lr'); + }, 'Computed value of orthogonal writing-mode on table cell'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/table-position-sticky-computed.html b/third_party/blink/web_tests/external/wpt/css/css-tables/table-position-sticky-computed.html new file mode 100644 index 0000000..b0116ae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/table-position-sticky-computed.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<title>Computed value of position:sticky for table elements</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<link rel="help" href="https://www.w3.org/TR/css-tables-3"> +<link rel="help" href="https://crbug.com/1307976"> +<style> + table * { + position: sticky; + } +</style> + +<table> + <thead> + </thead> + <tbody> + <tr> + <td>Test</td> + </tr> + </tbody> + <tfoot> + </tfoot> +</table> + +<script> + for (let element of document.querySelectorAll('table *')) { + test(() => { + assert_equals(getComputedStyle(element).position, 'sticky'); + }, `Computed value of position:sticky on ${element.tagName}`); + } +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html new file mode 100644 index 0000000..6deebf2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html
@@ -0,0 +1,85 @@ +<!doctype html> +<meta charset=utf-8> +<meta name=timeout content=long> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="resources/common.js"></script> +<script src="resources/popup-test.js"></script> +<script> + +[ + // None of the following should be recognized as "same-origin" (hence the + // preserved opener). + { + "title": "coop with semi-column", + "coop": "same-origin;", + }, + { + "title": "coop with vertical tab", + "coop": "\u000bsame-origin\u000b", + }, + { + "title": "coop with form feed", + "coop": "\u000csame-origin\u000c", + }, + { + "title": "coop with carriage return", + "coop": "\u000dsame-origin\u000d", + }, + { + "title": "coop with capital letter", + "coop": "Same-origin", + }, + { + "title": "coop with bad structured header 1", + "coop": "same-origin;\tfoo=bar", + }, + { + "title": "coop with bad structured header 2", + "coop": "same-origin ;foo=bar", + }, + { + "title": "coop with bad structured header 3", + "coop": "same-origin; foo=bar;", + }, + { + "title": "coop as a structured header 'string' item", + "coop": "\"same-origin\"", + }, + { + "title": "coop as a structured header 'byte sequence' item", + "coop": ":c2FtZS1vcmlnaW4=:", + }, + { + "title": "coop as a structured header 'boolean' item", + "coop": "?1", + }, + { + "title": "coop as a structured header 'integer or decimal' item", + "coop": "1", + }, + { + "title": "coop as an unrecognized structured header type", + "coop": "$same-origin", + }, + { + "title": "coop with duplicate value", + "coop": "same-origin same-origin", + }, + { + // Note: comma must be escaped here to not mess with the WPT pipe function. + "title": "coop with duplicate value, separated by a comma", + "coop": "same-origin\\,same-origin", + }, + { + "title": "coop with preceding asterisk character", + "coop": "*same-origin ", + } +].forEach(variant => { + popup_test(`Parsing ${variant.title}`, SAME_ORIGIN, variant.coop, "preserved"); +}); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html new file mode 100644 index 0000000..b5f20f8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html
@@ -0,0 +1,17 @@ +<!doctype html> +<meta charset=utf-8> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="resources/common.js"></script> +<script src="resources/popup-test.js"></script> +<script> + popup_test( + `Simple document with non-ascii COOP header opening a same-origin popup`, + SAME_ORIGIN, + "unsafe-none", + "preserved"); +</script> +
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.headers new file mode 100644 index 0000000..54e44a7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.headers
@@ -0,0 +1 @@ +Cross-Origin-Opener-Policy: same%FForigin
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html new file mode 100644 index 0000000..a1430cb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html
@@ -0,0 +1,16 @@ +<!doctype html> +<meta charset=utf-8> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="resources/common.js"></script> +<script src="resources/popup-test.js"></script> +<script> + popup_test( + `Simple document with duplicated COOP header opening a same-origin popup`, + SAME_ORIGIN, + "unsafe-none", + "preserved"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.headers new file mode 100644 index 0000000..85c58be --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.headers
@@ -0,0 +1,2 @@ +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Opener-Policy: same-origin
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-successes.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-successes.https.html new file mode 100644 index 0000000..0d3dadb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-successes.https.html
@@ -0,0 +1,44 @@ +<!doctype html> +<meta charset=utf-8> +<meta name=timeout content=long> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="resources/common.js"></script> +<script src="resources/popup-test.js"></script> +<script> + +[ + // All of the following should be recognized as "same-origin" (hence the + // severed opener link). + { + "title": "coop with leading space", + "coop": " same-origin", + }, + { + "title": "coop with trailing space", + "coop": "same-origin ", + }, + { + "title": "coop with leading tab", + "coop": "\tsame-origin", + }, + { + "title": "coop with trailing tab", + "coop": "same-origin\t", + }, + { + "title": "coop with duplicate value, separated by semi-column", + "coop": "same-origin;same-origin", + }, + { + "title": "coop with valid structured header", + "coop": "same-origin; foo=bar", + } +].forEach(variant => { + popup_test(`Parsing ${variant.title}`, SAME_ORIGIN, variant.coop, "severed"); +}); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing.https.html deleted file mode 100644 index 2839c381..0000000 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing.https.html +++ /dev/null
@@ -1,52 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="resources/common.js"></script> - -<div id=log></div> -<script> - -let tests = [ - // popup Origin, popup COOP, expect opener - - // None of the following should be recognized as "same-origin" (hence the - // "expected opener" value of `true`). - [SAME_ORIGIN, { percentEncoded: "same%FForigin" }, true], // non-ASCII byte - [SAME_ORIGIN, "same-origin;", true], - [SAME_ORIGIN, "\u000bsame-origin\u000b", true], // vertical tab - [SAME_ORIGIN, "\u000csame-origin\u000c", true], // form feed - [SAME_ORIGIN, "\u000dsame-origin\u000d", true], // carriage return - [SAME_ORIGIN, "Same-origin", true], - [SAME_ORIGIN, "same-origin;\tfoo=bar", true], - [SAME_ORIGIN, "same-origin ;foo=bar", true], - [SAME_ORIGIN, "same-origin; foo=bar;", true], - [SAME_ORIGIN, "\"same-origin\"", true], // HTTP structured fields "string" item - [SAME_ORIGIN, ":c2FtZS1vcmlnaW4=:", true], // HTTP structured fields "byte sequence" item - [SAME_ORIGIN, "?1", true], // HTTP structured fields "boolean" item - [SAME_ORIGIN, "1", true], // HTTP structured fields "integer or decimal" item - [SAME_ORIGIN, "$same-origin", true], // the item type is unrecognized - [SAME_ORIGIN, "same-origin same-origin", true], - [SAME_ORIGIN, "same-origin,same-origin", true], - [SAME_ORIGIN, "*same-origin ", true], - - // All of the following should be recognized as "same-origin" (hence the - // "expected opener" value of `false`). - [SAME_ORIGIN, " same-origin", false], - [SAME_ORIGIN, "same-origin ", false], - [SAME_ORIGIN, "\tsame-origin", false], - [SAME_ORIGIN, "same-origin\t", false], - [SAME_ORIGIN, "same-origin;same-origin", false], - [SAME_ORIGIN, "same-origin; foo=bar", false], -]; - -run_coop_tests("unspecified", tests); - -async_test((t) => { - const channelName = `none_to_${SAME_ORIGIN.name}_duplicated-header`; - const url = `${SAME_ORIGIN.origin}/html/cross-origin-opener-policy/resources/coop-same-origin-repeated.asis?channel=${channelName}`; - - url_test(t, url, channelName, true); -}, `unspecified document opening popup to ${SAME_ORIGIN.origin} with repeated COOP header`); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resources/common.js b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resources/common.js index 39794f7..34589f4 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resources/common.js +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resources/common.js
@@ -62,16 +62,8 @@ }); } -function percent_encode(objectOrString) { - if (typeof objectOrString === "object") { - return objectOrString.percentEncoded; - } - return encodeURIComponent(objectOrString); -} - function coop_coep_test(t, host, coop, coep, channelName, hasOpener, openerDOMAccess, callback) { - const coopPercentEncoded = percent_encode(coop); - url_test(t, `${host.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=${coopPercentEncoded}&coep=${coep}&channel=${encodeURIComponent(channelName)}`, channelName, hasOpener, openerDOMAccess, callback); + url_test(t, `${host.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=${encodeURIComponent(coop)}&coep=${coep}&channel=${encodeURIComponent(channelName)}`, channelName, hasOpener, openerDOMAccess, callback); } function coop_test(t, host, coop, channelName, hasOpener, callback) {
diff --git a/third_party/closure_compiler/externs/file_manager_private.js b/third_party/closure_compiler/externs/file_manager_private.js index cadb63b1..cc4412ef 100644 --- a/third_party/closure_compiler/externs/file_manager_private.js +++ b/third_party/closure_compiler/externs/file_manager_private.js
@@ -1387,6 +1387,11 @@ chrome.fileManagerPrivate.openWindow = function(params, callback) {}; /** + * Opens the feedback report window. + */ +chrome.fileManagerPrivate.sendFeedback = function() {}; + +/** * Starts an I/O task of type |type| on |entries|. Task type specific parameters * passed via |params|. * @param {!chrome.fileManagerPrivate.IOTaskType} type
diff --git a/tools/binary_size/libsupersize/dwarfdump.py b/tools/binary_size/libsupersize/dwarfdump.py index 37c7ddf..f357a0dc 100755 --- a/tools/binary_size/libsupersize/dwarfdump.py +++ b/tools/binary_size/libsupersize/dwarfdump.py
@@ -25,8 +25,6 @@ def __init__(self, range_info_list): self._range_info_list = range_info_list self._largest_address = 0 - self._unmatched_queries_count = 0 - self._total_queries_count = 0 if self._range_info_list: self._largest_address = self._range_info_list[-1][0].stop @@ -36,7 +34,6 @@ Only symbols in the .text section of the elf file are supported. """ - self._total_queries_count += 1 # Bisect against stop = self._largest_address + 1 to avoid bisecting against # the "source path" tuple component. bisect_index = bisect.bisect_right( @@ -47,7 +44,6 @@ if info[0].start <= address < info[0].stop: return info[1] - self._unmatched_queries_count += 1 return '' def NumberOfPaths(self): @@ -57,10 +53,6 @@ def num_ranges(self): return len(self._range_info_list) - @property - def unmatched_queries_ratio(self): - return self._unmatched_queries_count / self._total_queries_count - def CreateAddressSourceMapper(elf_path): """Runs dwarfdump. Returns object for querying source path given address.""" @@ -82,6 +74,7 @@ '--debug-info', '--recurse-depth=0', ] + logging.debug('Running: %s', ' '.join(cmd)) stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL, encoding='utf-8') @@ -206,15 +199,20 @@ def main(): parser = argparse.ArgumentParser() - parser.add_argument('dwarf_dump_output', type=os.path.realpath) + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--dwarf-dump-output', type=os.path.realpath) + group.add_argument('--elf-file', type=os.path.realpath) args = parser.parse_args() logging.basicConfig(level=logging.DEBUG, format='%(levelname).1s %(relativeCreated)6d %(message)s') - with open(args.dwarf_dump_output, 'r') as f: - source_mapper = CreateAddressSourceMapperForTest(f.read().splitlines()) - logging.warning('Found %d source paths across %s ranges', + if args.dwarf_dump_output: + with open(args.dwarf_dump_output, 'r') as f: + source_mapper = CreateAddressSourceMapperForTest(f.read().splitlines()) + else: + source_mapper = CreateAddressSourceMapper(args.elf_file) + logging.warning('Found %d source paths across %d ranges', source_mapper.NumberOfPaths(), source_mapper.num_ranges)
diff --git a/tools/binary_size/libsupersize/models.py b/tools/binary_size/libsupersize/models.py index 9d9e05ac1..015ac83 100644 --- a/tools/binary_size/libsupersize/models.py +++ b/tools/binary_size/libsupersize/models.py
@@ -55,6 +55,7 @@ APK_PREFIX_PATH = '$APK' NATIVE_PREFIX_PATH = '$NATIVE' +SYSTEM_PREFIX_PATH = '$SYSTEM' DEX_SECTIONS = ( SECTION_DEX,
diff --git a/tools/binary_size/libsupersize/native.py b/tools/binary_size/libsupersize/native.py index 560552c..61a98fe 100644 --- a/tools/binary_size/libsupersize/native.py +++ b/tools/binary_size/libsupersize/native.py
@@ -106,18 +106,35 @@ def _AddSourcePathsUsingAddress(dwarf_source_mapper, raw_symbols): logging.info('Looking up source paths from dwarfdump') + query_count = 0 + match_count = 0 + abs_count = 0 for symbol in raw_symbols: if symbol.section_name != models.SECTION_TEXT: continue + query_count += 1 source_path = dwarf_source_mapper.FindSourceForTextAddress(symbol.address) - if source_path and not os.path.isabs(source_path): - symbol.source_path = source_path + if source_path: + match_count += 1 + if os.path.isabs(source_path): + # Use basename for any absolute path. NDK prebuilts have these. + # E.g.: /buildbot/src/android/ndk-release-r23/toolchain/llvm-project/ + # libcxx/src/vector.cpp + symbol.source_path = os.path.join(models.SYSTEM_PREFIX_PATH, + os.path.basename(source_path)) + abs_count += 1 + else: + symbol.source_path = source_path + logging.info('dwarfdump found %d of %d .text symbols. Ignored %d abs paths', + match_count, query_count, abs_count) # Majority of unmatched queries are for assembly source files (ex libav1d) # and v8 builtins. - assert dwarf_source_mapper.unmatched_queries_ratio < 0.2, ( - 'Percentage of failing |dwarf_source_mapper| queries ' + - '({}%) >= 20% '.format(dwarf_source_mapper.unmatched_queries_ratio * 100) - + 'FindSourceForTextAddress() likely has a bug.') + if query_count > 0: + unmatched_ratio = (query_count - match_count) / query_count + assert unmatched_ratio < 0.2, ( + 'Percentage of failing |dwarf_source_mapper| queries ' + + '({}%) >= 20% '.format(unmatched_ratio * 100) + + 'FindSourceForTextAddress() likely has a bug.') def _ConnectNmAliases(raw_symbols):
diff --git a/tools/binary_size/libsupersize/viewer/caspian/tree_builder.cc b/tools/binary_size/libsupersize/viewer/caspian/tree_builder.cc index 1f9c29d..35ae4d8 100644 --- a/tools/binary_size/libsupersize/viewer/caspian/tree_builder.cc +++ b/tools/binary_size/libsupersize/viewer/caspian/tree_builder.cc
@@ -15,7 +15,7 @@ /** Name used by a directory created to hold symbols with no name. */ constexpr const char kComponentSep = '>'; constexpr const char kPathSep = '/'; -constexpr const char* kNoName = "(No path)"; +constexpr const char kNoPath[] = "(No path)"; } // namespace TreeBuilder::TreeBuilder(SizeInfo* size_info) { @@ -53,9 +53,10 @@ std::unordered_map<GroupedPath, std::vector<const BaseSymbol*>> symbols_by_grouped_path; for (const BaseSymbol* sym : symbols_) { - GroupedPath key = - GroupedPath{lens_->ParentName(*sym), - sym->SourcePath() ? sym->SourcePath() : sym->ObjectPath()}; + const char* path = *sym->SourcePath() ? sym->SourcePath() + : *sym->ObjectPath() ? sym->ObjectPath() + : kNoPath; + GroupedPath key = GroupedPath{lens_->ParentName(*sym), path}; if (ShouldIncludeSymbol(key, *sym)) { symbols_by_grouped_path[key].push_back(sym); } @@ -175,12 +176,7 @@ if (file_node == nullptr || grouped_path.path.empty()) { file_node = new TreeNode(); file_node->artifact_type = ArtifactType::kFile; - file_node->id_path = grouped_path; - if (file_node->id_path.path.empty()) { - file_node->id_path.path = kNoName; - } - file_node->short_name_index = file_node->id_path.size() - file_node->id_path.ShortName(sep_).size(); _parents[file_node->id_path] = file_node;
diff --git a/tools/cast3p/cast_core.version b/tools/cast3p/cast_core.version index bd6fb6b..9f7d9875 100644 --- a/tools/cast3p/cast_core.version +++ b/tools/cast3p/cast_core.version
@@ -1 +1 @@ -cast_20220318_0600_RC00 \ No newline at end of file +cast_20220428_0600_RC00
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 7f6ba37..8b6d6860 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -117,6 +117,7 @@ 'android-weblayer-with-aosp-webview-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google', # Use webview_monochrome as this builder triggers tests on Android O & P 'android-weblayer-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_disable_proguard_webview_monochrome', + 'android-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_trichrome_webview_shell_reclient', }, 'chromium.android.fyi': { @@ -934,6 +935,7 @@ 'android-weblayer-pie-x86-rel-tests': 'android_release_trybot_minimal_symbols_x86_fastbuild_disable_proguard_webview_monochrome', 'android-weblayer-pie-x86-wpt-fyi-rel': 'android_release_trybot_x86_fastbuild_webview_monochrome', 'android-weblayer-pie-x86-wpt-smoketest': 'android_release_trybot_x86_fastbuild_webview_monochrome', + 'android-webview-10-x86-rel-tests': 'android_release_trybot_x86_fastbuild_webview_trichrome', 'android-webview-12-x64-dbg': 'android_debug_trybot_x64_webview_trichrome_webview_shell', 'android-webview-marshmallow-arm64-dbg': 'android_release_trybot_arm64_webview_google', 'android-webview-nougat-arm64-dbg': 'android_release_trybot_arm64_webview_monochrome',
diff --git a/tools/mb/mb_config_expectations/chromium.android.json b/tools/mb/mb_config_expectations/chromium.android.json index c0751ff..6ed8a68 100644 --- a/tools/mb/mb_config_expectations/chromium.android.json +++ b/tools/mb/mb_config_expectations/chromium.android.json
@@ -580,5 +580,24 @@ "use_errorprone_java_compiler": false, "use_goma": true } + }, + "android-x86-rel": { + "gn_args": { + "dcheck_always_on": false, + "disable_android_lint": true, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "strip_debug_info": true, + "symbol_level": 1, + "system_webview_package_name": "com.google.android.webview.debug", + "system_webview_shell_package_name": "org.chromium.my_webview_shell", + "target_cpu": "x86", + "target_os": "android", + "use_errorprone_java_compiler": false, + "use_rbe": true, + "use_remoteexec": true + } } } \ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json index 846b6dd..93ff6cc 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -918,6 +918,23 @@ "use_goma": true } }, + "android-webview-10-x86-rel-tests": { + "gn_args": { + "dcheck_always_on": true, + "disable_android_lint": true, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "strip_debug_info": true, + "symbol_level": 0, + "system_webview_package_name": "com.google.android.webview.debug", + "target_cpu": "x86", + "target_os": "android", + "use_errorprone_java_compiler": false, + "use_goma": true + } + }, "android-webview-12-x64-dbg": { "gn_args": { "ffmpeg_branding": "Chrome",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 9edf92a4..47282a8e 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -32543,6 +32543,8 @@ <int value="1648" label="LOGIN_REQUESTEXTERNALLOGOUT"/> <int value="1649" label="LOGIN_NOTIFYEXTERNALLOGOUTDONE"/> <int value="1650" label="PASSWORDSPRIVATE_RECORDCHANGEPASSWORDFLOWSTARTED"/> + <int value="1651" label="ENTERPRISEREPORTINGPRIVATE_ENQUEUERECORD"/> + <int value="1652" label="FILEMANAGERPRIVATE_SENDFEEDBACK"/> </enum> <enum name="ExtensionIconState"> @@ -58837,13 +58839,6 @@ <int value="2" label="Unknown or invalid switch found"/> </enum> -<enum name="LoginFlowUserLoginType"> - <int value="0" label="New User Online Login"/> - <int value="1" label="Existing User Online Login"/> - <int value="2" label="User Offline Login"/> - <int value="3" label="Ephemeral User Login"/> -</enum> - <enum name="LoginIsKnownUser"> <int value="0" label="Unknown user"/> <int value="1" label="Known user"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index 776e671..5930b28 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -1484,7 +1484,7 @@ </histogram> <histogram name="Android.HomeButton.PerProfileType" enum="BrowserProfileType" - expires_after="2022-06-12"> + expires_after="2022-09-12"> <owner>sideyilmaz@chromium.org</owner> <owner>chrome-incognito@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml index e0f32fe13..b6fe6b5e 100644 --- a/tools/metrics/histograms/metadata/blink/histograms.xml +++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -2900,17 +2900,6 @@ </token> </histogram> -<histogram name="Blink.WindowOpen.FromAdState" enum="WindowOpenFromAdState" - expires_after="2019-08-30"> - <owner>yaoxia@chromium.org</owner> - <owner>csharrison@chromium.org</owner> - <summary> - Indicates whether the page called window.open() with an ad script in the - stack and/or from an ad subframe. Recorded whenever window.open() is called - when AdTagging is enabled. - </summary> -</histogram> - <histogram name="Blink.{CookieOperation}Time.Manager{ManagerState}" units="ms" expires_after="2022-08-09"> <owner>cduvall@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml index 1fee147..99c6263 100644 --- a/tools/metrics/histograms/metadata/login/histograms.xml +++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -125,27 +125,6 @@ <summary>Chrome OS login failure reason.</summary> </histogram> -<histogram name="Login.Flow.{UserVisibility}.{UserCount}" - enum="LoginFlowUserLoginType" expires_after="2022-12-15"> - <owner>sherrilin@google.com</owner> - <owner>cros-lurs@google.com</owner> - <summary> - Report the type of user login and the number of it on a device. It is - triggered when a login is successful - </summary> - <token key="UserVisibility"> - <variant name="HideUsers" summary="ShowUserOnSignin policy is set false"/> - <variant name="ShowUsers" summary="ShowUserOnSignin policy is set true"/> - </token> - <token key="UserCount"> - <variant name="0" summary="0 users"/> - <variant name="1" summary="1 users"/> - <variant name="2" summary="2 users"/> - <variant name="Few" summary="3 to 5 users"/> - <variant name="Many" summary="More than 5 users"/> - </token> -</histogram> - <histogram name="Login.InvalidCombinationsOfAllowedUsersPolicies" enum="AllowedUsersPoliciesInvalidState" expires_after="2022-10-17"> <owner>emaamari@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 98dd17d..cc0576c 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -3388,6 +3388,19 @@ </summary> </histogram> +<histogram name="Conversions.FiltersPerFilterData" units="filters" + expires_after="2022-10-11"> + <owner>linnan@chromium.org</owner> + <owner>johnidel@chromium.org</owner> + <owner>measurement-api-dev+metrics@google.com</owner> + <summary> + Measures filter sizes in source and trigger registrations. This includes + filter data in source, top-level trigger, event-level and aggregatable + trigger data. Recorded once for each filter data when parsed from the + attributionsrc response. + </summary> +</histogram> + <histogram name="Conversions.ImpressionIgnoredByFeaturePolicy" enum="BooleanIgnored" expires_after="M105"> <owner>apaseltiner@chromium.org</owner> @@ -3755,6 +3768,19 @@ </summary> </histogram> +<histogram name="Conversions.ValuesPerFilter" units="values" + expires_after="2022-10-11"> + <owner>linnan@chromium.org</owner> + <owner>johnidel@chromium.org</owner> + <owner>measurement-api-dev+metrics@google.com</owner> + <summary> + Measures the number of values in a filter. This includes filter data in + source, top-level trigger, event-level and aggregatable trigger data. + Recorded once for each filter in the filter data when parsed from the + attributionsrc response. + </summary> +</histogram> + <histogram name="CopylessPaste.CacheHit" enum="CopylessCacheHit" expires_after="2020-03-01"> <owner>wychen@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index f439391..8f12f07 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -995,10 +995,9 @@ <owner>vsemeniuk@google.com</owner> <summary> Count of leaked credentials found when the password bulk check completed - successfully (see '.LeaksFoundOnErrorOrCanceled' for non-success cases). - Note that this counts unique username+password pairs, so in the case of - password reuse, this does not correspond to the number of user-visible - credentials. + successfully. Note that this counts unique username+password pairs, so in + the case of password reuse, this does not correspond to the number of + user-visible credentials. </summary> </histogram> @@ -1141,7 +1140,7 @@ </histogram> <histogram name="PasswordManager.CompromisedCredentials2.{Issue}" - units="credentials" expires_after="2022-06-12"> + units="credentials" expires_after="2022-09-12"> <owner>vasilii@chromium.org</owner> <owner>vsemeniuk@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml index 4b9172b..0cc24a1 100644 --- a/tools/metrics/histograms/metadata/sync/histograms.xml +++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -326,6 +326,19 @@ </summary> </histogram> +<histogram name="Sync.CustomOSSync" enum="SyncModelTypes" + expires_after="2022-10-16"> + <owner>mmoskvitin@google.com</owner> + <owner>treib@chromium.org</owner> + <component>Services>Sync</component> + <summary> + For users who have *not* selected the "Sync Everything" option, + this records all the OS data types they have selected to sync. Samples are + taken every time the Sync data types are (re)configured, which typically + happens during startup and when the user changes any Sync settings. + </summary> +</histogram> + <histogram name="Sync.CustomSync3" enum="SyncModelTypes" expires_after="2022-10-16"> <owner>treib@chromium.org</owner> @@ -337,9 +350,8 @@ taken every time the Sync data types are (re)configured, which typically happens during startup and when the user changes any Sync settings. - NOTE: this may stop showing OS datatypes like WIFI_CONFIGURATIONS once the - SplitSettingsSync feature is enabled. New metrics will be added for those - (crbug.com/1105956). + NOTE: this doesn't include OS datatypes once the SplitSettingsSync feature + is enabled. Use Sync.CustomOSSync for those. </summary> </histogram>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index b64ced73..cd2a196c 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "fa4c3731aaacd16bcfc760e4cd7c2241a1cfeca6", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/f8b405298bd883ba95f7a14acfce230b37487ad3/trace_processor_shell.exe" + "hash": "70ac1cbe8ba68f6bd3f7ddc94f5eb25cfb9e9e23", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/69bc804a183b29d2eeaa9a61a589127db9228fe1/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": "d41d24c9ab70b2f75d7615c81b24ab588af76180", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/f8b405298bd883ba95f7a14acfce230b37487ad3/trace_processor_shell" + "hash": "8e9e73dc91eaeb99ef9c7579bb6e768fe36705f5", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/69bc804a183b29d2eeaa9a61a589127db9228fe1/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6", "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "ea492ae68dcfb411e19a2eaab1575e728c2c72c4", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/f8b405298bd883ba95f7a14acfce230b37487ad3/trace_processor_shell" + "hash": "bac72259adf9b15ae9730679fef86a90b56ef772", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/69bc804a183b29d2eeaa9a61a589127db9228fe1/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogProperties.java b/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogProperties.java index a821b7c..71d5ba4c 100644 --- a/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogProperties.java +++ b/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogProperties.java
@@ -102,6 +102,10 @@ public static final WritableObjectPropertyKey<View> CUSTOM_VIEW = new WritableObjectPropertyKey<>(); + /** The customized view replacing the button bar of the dialog. */ + public static final WritableObjectPropertyKey<View> CUSTOM_BUTTON_BAR_VIEW = + new WritableObjectPropertyKey<>(); + /** The text on the positive button. */ public static final WritableObjectPropertyKey<String> POSITIVE_BUTTON_TEXT = new WritableObjectPropertyKey<>(); @@ -182,7 +186,7 @@ public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {CONTROLLER, CONTENT_DESCRIPTION, TITLE, TITLE_MAX_LINES, TITLE_ICON, MESSAGE_PARAGRAPH_1, MESSAGE_PARAGRAPH_2, - CUSTOM_VIEW, POSITIVE_BUTTON_TEXT, POSITIVE_BUTTON_ICON, + CUSTOM_VIEW, CUSTOM_BUTTON_BAR_VIEW, POSITIVE_BUTTON_TEXT, POSITIVE_BUTTON_ICON, POSITIVE_BUTTON_CONTENT_DESCRIPTION, POSITIVE_BUTTON_DISABLED, NEGATIVE_BUTTON_TEXT, NEGATIVE_BUTTON_CONTENT_DESCRIPTION, NEGATIVE_BUTTON_DISABLED, FOOTER_MESSAGE, CANCEL_ON_TOUCH_OUTSIDE, FILTER_TOUCH_FOR_SECURITY, TOUCH_FILTERED_CALLBACK,
diff --git a/ui/base/clipboard/clipboard_data.cc b/ui/base/clipboard/clipboard_data.cc index 949bafa..066df20e 100644 --- a/ui/base/clipboard/clipboard_data.cc +++ b/ui/base/clipboard/clipboard_data.cc
@@ -104,36 +104,59 @@ return !(*this == that); } -absl::optional<size_t> ClipboardData::size() const { - if (format_ & static_cast<int>(ClipboardInternalFormat::kFilenames)) - return absl::nullopt; +absl::optional<size_t> ClipboardData::size( + const absl::optional<ClipboardInternalFormat>& format) const { size_t total_size = 0; - if (format_ & static_cast<int>(ClipboardInternalFormat::kText)) + if (format_ & static_cast<int>(ClipboardInternalFormat::kText)) { + if (format.has_value() && *format == ClipboardInternalFormat::kText) + return text_.size(); total_size += text_.size(); - if (format_ & static_cast<int>(ClipboardInternalFormat::kHtml)) { - total_size += markup_data_.size(); - total_size += url_.size(); } - if (format_ & static_cast<int>(ClipboardInternalFormat::kSvg)) + if (format_ & static_cast<int>(ClipboardInternalFormat::kHtml)) { + if (format.has_value() && *format == ClipboardInternalFormat::kHtml) + return markup_data_.size() + url_.size(); + total_size += markup_data_.size() + url_.size(); + } + if (format_ & static_cast<int>(ClipboardInternalFormat::kSvg)) { + if (format.has_value() && *format == ClipboardInternalFormat::kSvg) + return svg_data_.size(); total_size += svg_data_.size(); - if (format_ & static_cast<int>(ClipboardInternalFormat::kRtf)) + } + if (format_ & static_cast<int>(ClipboardInternalFormat::kRtf)) { + if (format.has_value() && *format == ClipboardInternalFormat::kRtf) + return rtf_data_.size(); total_size += rtf_data_.size(); + } if (format_ & static_cast<int>(ClipboardInternalFormat::kBookmark)) { - total_size += bookmark_title_.size(); - total_size += bookmark_url_.size(); + if (format.has_value() && *format == ClipboardInternalFormat::kBookmark) + return bookmark_title_.size() + bookmark_url_.size(); + total_size += bookmark_title_.size() + bookmark_url_.size(); } if (format_ & static_cast<int>(ClipboardInternalFormat::kPng)) { // If there is an unencoded image, use the bitmap's size. This will be // inaccurate by a few bytes. + size_t image_size; if (maybe_png_.has_value()) { - total_size += maybe_png_.value().size(); + image_size = maybe_png_.value().size(); } else { DCHECK(maybe_bitmap_.has_value()); - total_size += maybe_bitmap_.value().computeByteSize(); + image_size = maybe_bitmap_.value().computeByteSize(); } + if (format.has_value() && *format == ClipboardInternalFormat::kPng) + return image_size; + total_size += image_size; } - if (format_ & static_cast<int>(ClipboardInternalFormat::kCustom)) + if (format_ & static_cast<int>(ClipboardInternalFormat::kCustom)) { + if (format.has_value() && *format == ClipboardInternalFormat::kCustom) + return custom_data_data_.size(); total_size += custom_data_data_.size(); + } + + if (format.has_value() || + (format_ & static_cast<int>(ClipboardInternalFormat::kFilenames))) { + return absl::nullopt; + } + return total_size; }
diff --git a/ui/base/clipboard/clipboard_data.h b/ui/base/clipboard/clipboard_data.h index 1e7e571..30ba0c75 100644 --- a/ui/base/clipboard/clipboard_data.h +++ b/ui/base/clipboard/clipboard_data.h
@@ -55,9 +55,11 @@ // Bitmask of ClipboardInternalFormat types. int format() const { return format_; } - // Returns the total size of the data in clipboard, or absl::nullopt if it - // can't be determined. - absl::optional<size_t> size() const; + // Returns the size of the data in clipboard of `format`, total size of the + // clipboard data if `format` is empty, and absl::nullopt if it can't be + // determined. + absl::optional<size_t> size( + const absl::optional<ClipboardInternalFormat>& format) const; const std::string& text() const { return text_; } void set_text(const std::string& text) {
diff --git a/ui/base/clipboard/clipboard_non_backed.cc b/ui/base/clipboard/clipboard_non_backed.cc index a3f77bf..94b8601 100644 --- a/ui/base/clipboard/clipboard_non_backed.cc +++ b/ui/base/clipboard/clipboard_non_backed.cc
@@ -27,6 +27,7 @@ #include "base/threading/sequenced_task_runner_handle.h" #include "build/chromeos_buildflags.h" #include "skia/ext/skia_utils_base.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/clipboard/clipboard_constants.h" #include "ui/base/clipboard/clipboard_data.h" @@ -284,14 +285,15 @@ return previous_data; } - bool IsReadAllowed(const DataTransferEndpoint* data_dst) const { + bool IsReadAllowed(const DataTransferEndpoint* data_dst, + absl::optional<ClipboardInternalFormat> format) const { DataTransferPolicyController* policy_controller = DataTransferPolicyController::Get(); auto* data = GetData(); if (!policy_controller || !data) return true; return policy_controller->IsClipboardReadAllowed(data->source(), data_dst, - data->size()); + data->size(format)); } int NumImagesEncodedForTesting() { return num_images_encoded_for_testing_; } @@ -463,7 +465,7 @@ DataTransferEndpoint* data_dst) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, absl::nullopt)) return nullptr; return clipboard_internal_->GetData(); @@ -501,32 +503,43 @@ DCHECK(CalledOnValidThread()); DCHECK(IsSupportedClipboardBuffer(buffer)); - if (!clipboard_internal_->IsReadAllowed(data_dst)) - return false; - if (format == ClipboardFormatType::PlainTextType() || format == ClipboardFormatType::UrlType()) - return clipboard_internal_->IsFormatAvailable( - ClipboardInternalFormat::kText); + return clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kText) && + clipboard_internal_->IsFormatAvailable( + ClipboardInternalFormat::kText); if (format == ClipboardFormatType::HtmlType()) - return clipboard_internal_->IsFormatAvailable( - ClipboardInternalFormat::kHtml); + return clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kHtml) && + clipboard_internal_->IsFormatAvailable( + ClipboardInternalFormat::kHtml); if (format == ClipboardFormatType::SvgType()) - return clipboard_internal_->IsFormatAvailable( - ClipboardInternalFormat::kSvg); + return clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kSvg) && + clipboard_internal_->IsFormatAvailable( + ClipboardInternalFormat::kSvg); if (format == ClipboardFormatType::RtfType()) - return clipboard_internal_->IsFormatAvailable( - ClipboardInternalFormat::kRtf); + return clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kRtf) && + clipboard_internal_->IsFormatAvailable( + ClipboardInternalFormat::kRtf); if (format == ClipboardFormatType::PngType() || format == ClipboardFormatType::BitmapType()) - return clipboard_internal_->IsFormatAvailable( - ClipboardInternalFormat::kPng); + return clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kPng) && + clipboard_internal_->IsFormatAvailable( + ClipboardInternalFormat::kPng); if (format == ClipboardFormatType::WebKitSmartPasteType()) - return clipboard_internal_->IsFormatAvailable( - ClipboardInternalFormat::kWeb); + return clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kWeb) && + clipboard_internal_->IsFormatAvailable( + ClipboardInternalFormat::kWeb); if (format == ClipboardFormatType::FilenamesType()) - return clipboard_internal_->IsFormatAvailable( - ClipboardInternalFormat::kFilenames); + return clipboard_internal_->IsReadAllowed( + data_dst, ClipboardInternalFormat::kFilenames) && + clipboard_internal_->IsFormatAvailable( + ClipboardInternalFormat::kFilenames); const ClipboardData* data = clipboard_internal_->GetData(); return data && data->custom_data_format() == format.GetName(); } @@ -567,7 +580,7 @@ DCHECK(CalledOnValidThread()); DCHECK(types); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, absl::nullopt)) return; types->clear(); @@ -587,7 +600,8 @@ std::u16string* result) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kText)) return; #if BUILDFLAG(IS_CHROMEOS) @@ -607,7 +621,8 @@ std::string* result) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kText)) return; #if BUILDFLAG(IS_CHROMEOS) @@ -630,7 +645,8 @@ uint32_t* fragment_end) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kHtml)) return; #if BUILDFLAG(IS_CHROMEOS) @@ -650,7 +666,8 @@ std::u16string* result) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kSvg)) return; #if BUILDFLAG(IS_CHROMEOS) @@ -670,7 +687,8 @@ std::string* result) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kRtf)) return; #if BUILDFLAG(IS_CHROMEOS) @@ -690,7 +708,8 @@ ReadPngCallback callback) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) { + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kPng)) { std::move(callback).Run(std::vector<uint8_t>()); return; } @@ -713,7 +732,8 @@ std::u16string* result) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kCustom)) return; #if BUILDFLAG(IS_CHROMEOS) @@ -734,7 +754,8 @@ std::vector<ui::FileInfo>* result) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kFilenames)) return; #if BUILDFLAG(IS_CHROMEOS) @@ -754,7 +775,8 @@ std::string* url) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, + ClipboardInternalFormat::kBookmark)) return; #if BUILDFLAG(IS_CHROMEOS) @@ -774,7 +796,7 @@ std::string* result) const { DCHECK(CalledOnValidThread()); - if (!clipboard_internal_->IsReadAllowed(data_dst)) + if (!clipboard_internal_->IsReadAllowed(data_dst, absl::nullopt)) return; #if BUILDFLAG(IS_CHROMEOS)
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb index 98e5c9d3..7eaca7c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -519,7 +519,7 @@ <translation id="5335458522276292100">Sikkerhedskopierer <ph name="FILE_COUNT" /> til <ph name="BEGIN_LINK" />Google Drev<ph name="END_LINK" /></translation> <translation id="535792325654997756">Person med katte</translation> <translation id="5358764674931277">Billedfrekvens</translation> -<translation id="5363339716524495120">Indtastningssproget er kinesisk</translation> +<translation id="5363339716524495120">Inputsproget er kinesisk</translation> <translation id="5368191757080475556">Del mappe med Linux</translation> <translation id="5402367795255837559">Braille</translation> <translation id="5411472733320185105">Brug ikke proxyindstillingerne til disse værter eller domæner:</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_el.xtb b/ui/chromeos/translations/ui_chromeos_strings_el.xtb index 2764412..1628cde 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_el.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
@@ -555,7 +555,7 @@ <translation id="5534520101572674276">Υπολογισμός μεγέθους</translation> <translation id="554153475311314364">Μεταγραφή Ελληνικών</translation> <translation id="5583640892426849032">Πλήκτρο Backspace</translation> -<translation id="5583664733673201137">Το εύρος στίξης είναι "Πλήρες"</translation> +<translation id="5583664733673201137">Το εύρος στίξης είναι Πλήρες</translation> <translation id="5602622065581044566">Βουλγαρικά με φωνητικό πληκτρολόγιο</translation> <translation id="5605830556594064952">Dvorak ΗΠΑ</translation> <translation id="5618330573454123917">Αυτό το αρχείο έχει σχεδιαστεί για υπολογιστή που χρησιμοποιεί λογισμικό Macintosh. Δεν είναι συμβατό με τη συσκευή σας, η οποία εκτελεί Chrome OS. <ph name="BEGIN_LINK_HELP" />Μάθετε περισσότερα<ph name="END_LINK_HELP" /> σχετικά με το άνοιγμα αρχείων στο Chrome OS.</translation> @@ -859,7 +859,7 @@ <translation id="8128733386027980860">Αγγλικά (ΗΠΑ) με πληκτρολόγιο Dvorak</translation> <translation id="8137331602592933310">Το "<ph name="FILENAME" />" έχει χρησιμοποιηθεί από κοινού με εσάς. Δεν μπορείτε να το διαγράψετε, επειδή δεν σας ανήκει.</translation> <translation id="813913629614996137">Εκκίνηση…</translation> -<translation id="8147028810663464959">Το εύρος χαρακτήρων είναι "Πλήρες"</translation> +<translation id="8147028810663464959">Το εύρος χαρακτήρων είναι Πλήρες</translation> <translation id="8151638057146502721">Διαμόρφωση</translation> <translation id="8154842056504218462">Επιλέχθηκαν όλες οι καταχωρίσεις.</translation> <translation id="8157684860301034423">Αποτυχία ανάκτησης των πληροφοριών της εφαρμογής.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb index 16efd3e..4fa2ea9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -841,7 +841,7 @@ <translation id="8128733386027980860">inglise (Ühendkuningriik), Dvoraki klaviatuuriga</translation> <translation id="8137331602592933310">Faili „<ph name="FILENAME" />” on teiega jagatud. Te ei saa seda kustutada, kuna te pole selle omanik.</translation> <translation id="813913629614996137">Lähtestamine …</translation> -<translation id="8147028810663464959">Märkide laius on täislaius</translation> +<translation id="8147028810663464959">Tähemärkide laius on täislaius</translation> <translation id="8151638057146502721">Seadista</translation> <translation id="8154842056504218462">Valiti kõik kirjed.</translation> <translation id="8157684860301034423">Rakenduse teabe toomine nurjus.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb index c01f2bea..02ae4e6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -841,7 +841,7 @@ <translation id="8128733386027980860">انگلیسی (بریتانیا) با صفحهکلید Dvorak</translation> <translation id="8137331602592933310">«<ph name="FILENAME" />» با شما به اشتراک گذاشته شده است. شما نمیتوانید آن را حذف کنید زیرا به شما تعلق ندارد.</translation> <translation id="813913629614996137">درحال مقداردهی اولیه…</translation> -<translation id="8147028810663464959">عرض نویسه «کامل» است</translation> +<translation id="8147028810663464959">عرض نویسه روی «کامل» تنظیم شده است</translation> <translation id="8151638057146502721">پیکربندی</translation> <translation id="8154842056504218462">همه ورودیها انتخاب شد.</translation> <translation id="8157684860301034423">اطلاعات برنامه بازیابی نشد.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb index 2db5e8e..6429d23 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -105,6 +105,7 @@ <translation id="1813278315230285598">Palvelut</translation> <translation id="1829129547161959350">Pingviini</translation> <translation id="183183971458492120">Ladataan tietoja…</translation> +<translation id="1832073788765803750">Kapea Katakana</translation> <translation id="1834290891154666894">Virheellinen aiheen vaihtoehtoisen nimen vastaavuusarvo</translation> <translation id="1838709767668011582">Google-sivusto</translation> <translation id="1844692022597038441">Tämä tiedosto ei ole käytettävissä offline-tilassa.</translation> @@ -518,6 +519,7 @@ <translation id="5335458522276292100">Varmuuskopioidaan <ph name="FILE_COUNT" /> <ph name="BEGIN_LINK" />Google Driveen<ph name="END_LINK" /></translation> <translation id="535792325654997756">Henkilö ja kissoja</translation> <translation id="5358764674931277">Kuvanopeus</translation> +<translation id="5363339716524495120">Syöttökieli on kiina</translation> <translation id="5368191757080475556">Jaa kansio Linuxin kanssa</translation> <translation id="5402367795255837559">Pistekirjoitus</translation> <translation id="5411472733320185105">Älä käytä välityspalvelimen asetuksia näille palvelimille ja verkkotunnuksille:</translation> @@ -540,6 +542,7 @@ <translation id="5534520101572674276">Lasketaan kokoa</translation> <translation id="554153475311314364">translitteroitu kreikka</translation> <translation id="5583640892426849032">Askelpalautin</translation> +<translation id="5583664733673201137">Välimerkkileveys on täysleveä</translation> <translation id="5602622065581044566">bulgaria, foneettinen näppäimistö</translation> <translation id="5605830556594064952">USA, Dvorak</translation> <translation id="5618330573454123917">Tämä tiedosto on tarkoitettu Windows-ohjelmistoa käyttävälle tietokoneelle. Se ei ole yhteensopiva Chrome-käyttöjärjestelmää käyttävän laitteesi kanssa. <ph name="BEGIN_LINK_HELP" />Lue lisää<ph name="END_LINK_HELP" /> tiedostojen avaamisesta Chrome-käyttöjärjestelmällä.</translation> @@ -838,6 +841,7 @@ <translation id="8128733386027980860">englanti (Iso-Britannia), Dvorak-näppäimistö</translation> <translation id="8137331602592933310"><ph name="FILENAME" /> on jaettu sinulle. Et voi poistaa sitä, koska et ole tiedoston omistaja.</translation> <translation id="813913629614996137">Käynnistetään…</translation> +<translation id="8147028810663464959">Merkkileveys on täysleveä</translation> <translation id="8151638057146502721">Määritä</translation> <translation id="8154842056504218462">Kaikki kohteet valittiin.</translation> <translation id="8157684860301034423">Sovellustietojen noutaminen epäonnistui.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb index c02681b..997bc77 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -519,7 +519,7 @@ <translation id="5335458522276292100">Mencadangkan <ph name="FILE_COUNT" /> ke <ph name="BEGIN_LINK" />Google Drive<ph name="END_LINK" /></translation> <translation id="535792325654997756">Orang dengan kucing</translation> <translation id="5358764674931277">Kecepatan frame</translation> -<translation id="5363339716524495120">Bahasa masukan adalah China</translation> +<translation id="5363339716524495120">Bahasa input adalah Mandarin</translation> <translation id="5368191757080475556">Bagikan folder dengan Linux</translation> <translation id="5402367795255837559">Braille</translation> <translation id="5411472733320185105">Jangan menggunakan setelan proxy untuk host dan domain berikut:</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb index 133b7a80..19d09a10 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -95,6 +95,7 @@ <translation id="1747761757048858544">Нидерланд (Нидерланд)</translation> <translation id="174937106936716857">Барлық файлдар саны</translation> <translation id="1755345808328621801">Бұл файл Windows бағдарламалық құралын пайдаланатын компьютерге арналған. Ол ChromeOS жүйесімен жұмыс істейтін құрылғымен үйлесімді емес. Chrome Web Store дүкенінен сәйкес келетін балама қолданбаны іздеңіз.</translation> +<translation id="1757915090001272240">Кең латын</translation> <translation id="1773212559869067373">Аутентификация сертификаты жергілікті негізде қабылданбады</translation> <translation id="1775381402323441512">Бейне ақпараты</translation> <translation id="180035236176489073">Бұл файлдарға кіру үшін желіде болуыңыз керек.</translation> @@ -104,6 +105,7 @@ <translation id="1813278315230285598">Қызметтер</translation> <translation id="1829129547161959350">Пингвин</translation> <translation id="183183971458492120">Ақпарат жүктелуде…</translation> +<translation id="1832073788765803750">Жарты енді катакана</translation> <translation id="1834290891154666894">Енгізілген балама атау тақырыбы сәйкестігі жарамсыз.</translation> <translation id="1838709767668011582">Google сайты</translation> <translation id="1844692022597038441">Бұл файл желіден тыс қолжетімді емес.</translation> @@ -516,6 +518,7 @@ <translation id="5335458522276292100"><ph name="FILE_COUNT" /> файлдың <ph name="BEGIN_LINK" />Google Drive<ph name="END_LINK" /> қызметіндегі сақтық көшірмесі жасалуда</translation> <translation id="535792325654997756">Мысықтары бар адам</translation> <translation id="5358764674931277">Кадр жиілігі</translation> +<translation id="5363339716524495120">Енгізу тілі – қытай</translation> <translation id="5368191757080475556">Қалтаны Linux жүйесімен бөлісу</translation> <translation id="5402367795255837559">Брайль</translation> <translation id="5411472733320185105">Мына хосттар мен домендер үшін прокси параметрлерін пайдаланбау:</translation> @@ -538,6 +541,7 @@ <translation id="5534520101572674276">Көлемін есептеу</translation> <translation id="554153475311314364">Грек (транслитерация)</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5583664733673201137">Тыныс белгілерінің ені – толық</translation> <translation id="5602622065581044566">Болгар (фонетикалық пернетақтамен)</translation> <translation id="5605830556594064952">АҚШ Дворак</translation> <translation id="5618330573454123917">Бұл файл Macintosh бағдарламалық құралын пайдаланатын компьютерге арналған. Ол ChromeOS жүйесімен жұмыс істейтін құрылғымен үйлесімді емес. ChromeOS жүйесінде файлдарды ашу туралы <ph name="BEGIN_LINK_HELP" />толығырақ ақпарат алыңыз<ph name="END_LINK_HELP" />.</translation> @@ -747,6 +751,7 @@ <translation id="7489215562877293245"><ph name="FILE_COUNT" /> файл табылды <ph name="LINE_BREAK1" /> <ph name="BEGIN_LINK" />Google Drive<ph name="END_LINK" /> дискіне сақтық көшірмесін жасауға болады</translation> +<translation id="749452993132003881">Хирагана</translation> <translation id="7495372004724182530">Малаялам (фонетикалық)</translation> <translation id="7505167922889582512">Жасырын файлдарды көрсету</translation> <translation id="7514365320538308">Жүктеу</translation> @@ -835,6 +840,7 @@ <translation id="8128733386027980860">Ағылшын (БК), Дворак пернетақтасымен</translation> <translation id="8137331602592933310">"<ph name="FILENAME" />" сізбен бөлісілді. Өзіңіздікі болмағандықтан, оны жоя алмайсыз.</translation> <translation id="813913629614996137">Дайындауда…</translation> +<translation id="8147028810663464959">Таңба ені – толық</translation> <translation id="8151638057146502721">Конфигурациялау</translation> <translation id="8154842056504218462">Барлық жазба таңдалды.</translation> <translation id="8157684860301034423">Қолданба туралы ақпарат алынбады.</translation> @@ -844,6 +850,7 @@ <translation id="8208580316430297579">Өнер туындысы</translation> <translation id="8223479393428528563">Бұл файлдарды желіден тыс сақтау үшін желіге қайта қосылып, файлдарды тінтуірдің оң жағымен басыңыз және <ph name="OFFLINE_CHECKBOX_NAME" /> опциясын таңдаңыз.</translation> <translation id="8249296373107784235">Доғару</translation> +<translation id="8250690786522693009">Латын</translation> <translation id="8250920743982581267">Құжаттар</translation> <translation id="8261506727792406068">Жою</translation> <translation id="8261561378965667560">Қытай (құрылымдық енгізу)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb index 60e9985..0f22404 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
@@ -95,6 +95,7 @@ <translation id="1747761757048858544">Голланд (Нидерланд)</translation> <translation id="174937106936716857">Нийт файлын тоо</translation> <translation id="1755345808328621801">Энэ файл Windows программ хангамжийг ашиглаж буй PC-нд зориулагдсан. Энэ нь таны ChromeOS-г ажиллуулдаг төхөөрөмжид тохирохгүй. Chrome Веб Дэлгүүрээс орлуулж болох тохирох аппыг хайна уу.</translation> +<translation id="1757915090001272240">Латин цагаан толгойгоор</translation> <translation id="1773212559869067373">Баталгаажуулалтын гэрчилгээг түтгэлзүүлсэн байна</translation> <translation id="1775381402323441512">Видеоны мэдээлэл</translation> <translation id="180035236176489073">Та эдгээр файлуудад хандахын тулд онлайн байх ёстой.</translation> @@ -104,6 +105,7 @@ <translation id="1813278315230285598">Үйлчилгээ</translation> <translation id="1829129547161959350">Пенгвин</translation> <translation id="183183971458492120">Мэдээллийг ачаалж байна...</translation> +<translation id="1832073788765803750">Хагас өргөнтэй катакана</translation> <translation id="1834290891154666894">Субъектийн хоёрдогч нэрийн тохирлын оруулга буруу байна</translation> <translation id="1838709767668011582">Google сайт</translation> <translation id="1844692022597038441">Энэ файл нь боломжит оффлайн хэлбэртэй биш байна.</translation> @@ -514,6 +516,7 @@ <translation id="5335458522276292100"><ph name="FILE_COUNT" />-г <ph name="BEGIN_LINK" />Google Драйвт<ph name="END_LINK" /> нөөцөлж байна</translation> <translation id="535792325654997756">Мууртай хүн</translation> <translation id="5358764674931277">Фреймийн хурд</translation> +<translation id="5363339716524495120">Оролтын хэл нь Хятад хэл юм</translation> <translation id="5368191757080475556">Linux-тай фолдер хуваалцах</translation> <translation id="5402367795255837559">Брайль</translation> <translation id="5411472733320185105">Эдгээр сүлжээ эзэмшигч болон домайнуудад прокси тохируулгыг хэрэглэхгүй:</translation> @@ -536,6 +539,7 @@ <translation id="5534520101572674276">Хэмжээг тооцоолж байна</translation> <translation id="554153475311314364">Грек галиг</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5583664733673201137">Цэг таслалын өргөн бүтэн байна</translation> <translation id="5602622065581044566">Авиа зүйн гартай болгар</translation> <translation id="5605830556594064952">АНУ-ын Дворак</translation> <translation id="5618330573454123917">Энэ файл нь Macintosh программ хангамжийг ашиглаж буй компьютерт зориулагдсан байна. Энэ нь таны ChromeOS-г ажиллуулдаг төхөөрөмжид тохирохгүй. ChromeOS дээр файл нээх талаар <ph name="BEGIN_LINK_HELP" />нэмэлт мэдээлэл авна уу<ph name="END_LINK_HELP" />.</translation> @@ -745,6 +749,7 @@ <translation id="7489215562877293245"><ph name="FILE_COUNT" /> олдсон <ph name="LINE_BREAK1" /> <ph name="BEGIN_LINK" />Google Драйвт<ph name="END_LINK" /> нөөцлөхөд бэлэн</translation> +<translation id="749452993132003881">Хирагана</translation> <translation id="7495372004724182530">Малайлам авиа зүй</translation> <translation id="7505167922889582512">Далд файлуудыг харуулах</translation> <translation id="7514365320538308">Татаж авах</translation> @@ -833,6 +838,7 @@ <translation id="8128733386027980860">Dvorak гартай англи (ИБ)</translation> <translation id="8137331602592933310">"<ph name="FILENAME" />" Тантай хуваалцагдсан байна. Та энэ файлыг эзэмшдэггүй учраас устгах боломжгүй.</translation> <translation id="813913629614996137">Эхлүүлж байна…</translation> +<translation id="8147028810663464959">Тэмдэгтүүдийн өргөн бүтэн байна</translation> <translation id="8151638057146502721">Тохируулах</translation> <translation id="8154842056504218462">Бүх оролтыг сонгосон.</translation> <translation id="8157684860301034423">Аппын мэдээллийг сэргээж чадсангүй.</translation> @@ -842,6 +848,7 @@ <translation id="8208580316430297579">Урлагийн бүтээл</translation> <translation id="8223479393428528563">Эдгээр файлыг интернетэд холбогдоогүй байхдаа ашиглахаар хадгалахын тулд интернетэд холбогдсоныхоо дараагаар холбогдох файл дээр очин хулганын баруун талд даран <ph name="OFFLINE_CHECKBOX_NAME" /> сонголтыг сонгоно уу.</translation> <translation id="8249296373107784235">Цуцлах</translation> +<translation id="8250690786522693009">Латин цагаан толгойгоор</translation> <translation id="8250920743982581267">Документ</translation> <translation id="8261506727792406068">Устгах</translation> <translation id="8261561378965667560">Хятад матрицын арга</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb index 5bc2aa02..b7b43685 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb
@@ -95,6 +95,7 @@ <translation id="1747761757048858544">ਡੱਚ (ਨੀਦਰਲੈਂਡ)</translation> <translation id="174937106936716857">ਫ਼ਾਈਲਾਂ ਦੀ ਕੁੱਲ ਗਿਣਤੀ</translation> <translation id="1755345808328621801">ਇਹ ਫ਼ਾਈਲ Windows ਸਾਫ਼ਟਵੇਅਰ ਵਰਤਣ ਵਾਲੇ PC ਲਈ ਤਿਆਰ ਕੀਤੀ ਗਈ ਹੈ। ਇਹ ਤੁਹਾਡੇ ChromeOS ਨਾਲ ਚਲਣ ਵਾਲੇ ਡੀਵਾਈਸ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਇਸ ਦੇ ਬਦਲਾਅ ਵਜੋਂ ਕਿਸੇ ਅਨੁਕੂਲ ਐਪ ਲਈ 'Chrome ਵੈੱਬ ਸਟੋਰ' ਖੋਜੋ।</translation> +<translation id="1757915090001272240">ਵਾਈਡ ਲਾਤੀਨੀ</translation> <translation id="1773212559869067373">ਪ੍ਰਮਾਣਿਕਤਾ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਨੂੰ ਸਥਾਨਕ ਰੂਪ ਵਿਚ ਅਸਵੀਕਾਰ ਕੀਤਾ ਗਿਆ</translation> <translation id="1775381402323441512">ਵੀਡੀਓ ਜਾਣਕਾਰੀ</translation> <translation id="180035236176489073">ਤੁਹਾਨੂੰ ਇਹਨਾਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਆਨਲਾਈਨ ਹੋਣਾ ਪਵੇਗਾ।</translation> @@ -104,6 +105,7 @@ <translation id="1813278315230285598">ਸੇਵਾਵਾਂ</translation> <translation id="1829129547161959350">ਪੈਂਗਵਿਨ</translation> <translation id="183183971458492120">ਜਾਣਕਾਰੀ ਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ...</translation> +<translation id="1832073788765803750">ਅੱਧੀ ਚੌੜਾਈ ਕਾਟਾਕਾਨਾ</translation> <translation id="1834290891154666894">ਵਿਸ਼ੇ ਸੰਬੰਧੀ ਵਿਕਲਪਿਕ ਨਾਮ ਦੇ ਮਿਲਾਨ ਵਾਲਾ ਇੰਦਰਾਜ ਅਵੈਧ ਹੈ</translation> <translation id="1838709767668011582">Google ਸਾਈਟ</translation> <translation id="1844692022597038441">ਇਹ ਫ਼ਾਈਲ ਆਫ਼ਲਾਈਨ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</translation> @@ -516,7 +518,7 @@ <translation id="5335458522276292100"><ph name="BEGIN_LINK" />Google ਡਰਾਈਵ<ph name="END_LINK" /> 'ਤੇ <ph name="FILE_COUNT" /> ਦਾ ਬੈਕਅੱਪ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="535792325654997756">ਬਿੱਲੀਆਂ ਨਾਲ ਵਿਅਕਤੀ</translation> <translation id="5358764674931277">ਫ੍ਰੇਮ ਰੇਟ</translation> -<translation id="5363339716524495120">ਇਨਪੁਟ ਭਾਸ਼ਾ ਚੀਨੀ ਹੈ</translation> +<translation id="5363339716524495120">ਇਨਪੁੱਟ ਭਾਸ਼ਾ ਚੀਨੀ ਹੈ</translation> <translation id="5368191757080475556">Linux ਨਾਲ ਫੋਲਡਰ ਸਾਂਝਾ ਕਰੋ</translation> <translation id="5402367795255837559">ਬ੍ਰੇਲ</translation> <translation id="5411472733320185105">ਇਹਨਾਂ ਹੋਸਟਾਂ ਅਤੇ ਡੋਮੇਨਾਂ ਲਈ ਪ੍ਰੌਕਸੀ ਸੈਟਿੰਗਾਂ ਨਾ ਵਰਤੋ:</translation> @@ -749,6 +751,7 @@ <translation id="7489215562877293245"><ph name="FILE_COUNT" /> ਮਿਲੀਆਂ <ph name="LINE_BREAK1" /> <ph name="BEGIN_LINK" />Google ਡਰਾਈਵ<ph name="END_LINK" /> ਵਿੱਚ ਬੈਕਅੱਪ ਲੈਣ ਲਈ ਤਿਆਰ</translation> +<translation id="749452993132003881">ਹਿਰਾਗਾਨਾ</translation> <translation id="7495372004724182530">ਮਲਿਆਲਮ ਧੁਨੀਆਤਮਿਕ</translation> <translation id="7505167922889582512">ਲੁਕਾਈਆਂ ਫਾਈਲਾਂ ਦਿਖਾਓ</translation> <translation id="7514365320538308">ਡਾਊਨਲੋਡ ਕਰੋ</translation> @@ -837,7 +840,7 @@ <translation id="8128733386027980860">ਡੀਵੋਰਯੈਕ ਕੀ-ਬੋਰਡ ਦੇ ਨਾਲ ਅੰਗਰੇਜ਼ੀ (ਯੂ.ਕੇ.)</translation> <translation id="8137331602592933310">"<ph name="FILENAME" />" ਤੁਹਾਡੇ ਨਾਲ ਸ਼ੇਅਰ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ ਮਿਟਾ ਨਹੀਂ ਸਕਦੇ ਕਿਉਂਕਿ ਇਹ ਤੁਹਾਡੀ ਨਹੀਂ ਹੈ।</translation> <translation id="813913629614996137">ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> -<translation id="8147028810663464959">ਅੱਖਰ ਚੌੜਾਈ ਪੂਰੀ ਹੈ</translation> +<translation id="8147028810663464959">ਅੱਖਰ-ਚਿੰਨ੍ਹ ਦੀ ਚੌੜਾਈ ਪੂਰੀ ਹੈ</translation> <translation id="8151638057146502721">ਸੰਰੂਪਿਤ ਕਰੋ</translation> <translation id="8154842056504218462">ਸਾਰੇ ਇੰਦਰਾਜ ਚੁਣੇ ਗਏ।</translation> <translation id="8157684860301034423">ਐਪ ਜਾਣਕਾਰੀ ਨੂੰ ਮੁੜ-ਪ੍ਰਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।</translation> @@ -847,6 +850,7 @@ <translation id="8208580316430297579">ਆਰਟਵਰਕ</translation> <translation id="8223479393428528563">ਆਫ਼ਲਾਈਨ ਵਰਤੋਂ ਲਈ ਇਹ ਫ਼ਾਈਲਾਂ ਰੱਖਿਅਤ ਕਰਨ ਲਈ, ਵਾਪਸ ਆਨਲਾਈਨ ਜਾਓ, ਫ਼ਾਈਲਾਂ ਤੇ ਸੱਜਾ-ਕਲਿੱਕ ਕਰੋ ਅਤੇ <ph name="OFFLINE_CHECKBOX_NAME" /> ਵਿਕਲਪ ਚੁਣੋ।</translation> <translation id="8249296373107784235">ਰੋਕੋ</translation> +<translation id="8250690786522693009">ਲਾਤੀਨੀ</translation> <translation id="8250920743982581267">ਦਸਤਾਵੇਜ਼</translation> <translation id="8261506727792406068">ਮਿਟਾਓ</translation> <translation id="8261561378965667560">ਚੀਨੀ ਐਰੇ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_si.xtb b/ui/chromeos/translations/ui_chromeos_strings_si.xtb index d85f9fa..85bd302 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_si.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
@@ -95,6 +95,7 @@ <translation id="1747761757048858544">ලන්දේසි (නෙදර්ලන්තය)</translation> <translation id="174937106936716857">මුළු ගොනු ගණන</translation> <translation id="1755345808328621801">මෙම ගොනුව Windows මෘදුකාංගය භාවිත කරන පරිගණකයක් සඳහා සැලසුම් කර ඇත. මෙය ඔබගේ ChromeOS ධාවනය වන උපාංගය සමඟ නොගැළපේ. කරුණාකර ගැළපෙන ප්රතිස්ථාපන යෙදුමක් Chrome Web Store හි සොයන්න.</translation> +<translation id="1757915090001272240">පළල ලතින්</translation> <translation id="1773212559869067373">තහවුරු කිරීමේ සහතිකය ස්ථානීයව ප්රතික්ෂේප කෙරිණි</translation> <translation id="1775381402323441512">වීඩියෝ තොරතුරු</translation> <translation id="180035236176489073">මෙම ගොනු වෙත පිවිසීමට ඔබ ඔන්ලයින් සිටිය යුතුය.</translation> @@ -104,6 +105,7 @@ <translation id="1813278315230285598">සේවා</translation> <translation id="1829129547161959350">පෙන්ගුයින්</translation> <translation id="183183971458492120">තොරතුරු පූරණ කරමින්...</translation> +<translation id="1832073788765803750">අර්ධ පළල කටකානා</translation> <translation id="1834290891154666894">වලංගු නොවන මාතෘකා විකල්ප නම ගැළපීම ඇතුළත් කිරීම</translation> <translation id="1838709767668011582">Google අඩවිය</translation> <translation id="1844692022597038441">මෙම ගොනුව ඕෆ්ලයින් ලෙස ලද නොහැකිය.</translation> @@ -749,6 +751,7 @@ <translation id="7489215562877293245"><ph name="FILE_COUNT" /> හමු විය <ph name="LINE_BREAK1" /> <ph name="BEGIN_LINK" />Google Drive<ph name="END_LINK" /> වෙත උපස්ථ කිරීමට සූදානම්</translation> +<translation id="749452993132003881">හිරගනා</translation> <translation id="7495372004724182530">මලයාලම් ශබ්දිම</translation> <translation id="7505167922889582512">සැඟවුණු ගොනු පෙන්වන්න</translation> <translation id="7514365320538308">බාගන්න</translation> @@ -847,6 +850,7 @@ <translation id="8208580316430297579">සිත්තම්</translation> <translation id="8223479393428528563">මෙම ගොනු මාර්ගගත නොවන භාවිතයට සුරැකීමට, නැවත මාර්ගගත වී, ගොනු මත දකුණු ක්ලික් කර, <ph name="OFFLINE_CHECKBOX_NAME" /> අභිප්රේතය තෝරන්න.</translation> <translation id="8249296373107784235">අහෝසි කරන්න</translation> +<translation id="8250690786522693009">ලතින්</translation> <translation id="8250920743982581267">ලේඛන</translation> <translation id="8261506727792406068">මකන්න</translation> <translation id="8261561378965667560">චීන අරාව</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index f8ed6e9..8d61387 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -841,7 +841,7 @@ <translation id="8128733386027980860">ஆங்கிலம் (யூகே) - டிவோர்க் கீபோர்டு</translation> <translation id="8137331602592933310">உங்களுடன் "<ph name="FILENAME" />" பகிரப்பட்டுள்ளது. உங்களுக்குச் சொந்தமில்லாதது என்பதால் உங்களால் அதை நீக்க முடியாது.</translation> <translation id="813913629614996137">துவக்குகிறது...</translation> -<translation id="8147028810663464959">முழுமையான எழுத்துக்குறி அகலம்</translation> +<translation id="8147028810663464959">முழுமையான எழுத்துக்களின் அகலம்</translation> <translation id="8151638057146502721">உள்ளமை</translation> <translation id="8154842056504218462">அனைத்து உள்ளீடுகளும் தேர்ந்தெடுக்கப்பட்டுள்ளன.</translation> <translation id="8157684860301034423">ஆப்ஸ் தகவலை மீட்டெடுக்க முடியவில்லை.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb index 837c0ba..52beb21d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
@@ -542,7 +542,7 @@ <translation id="5534520101572674276">正在計算大小</translation> <translation id="554153475311314364">希臘文 (音譯)</translation> <translation id="5583640892426849032">Backspace</translation> -<translation id="5583664733673201137">標點符號為全形</translation> +<translation id="5583664733673201137">標點符號寬度為全形</translation> <translation id="5602622065581044566">保加利亞文 (拼音鍵盤)</translation> <translation id="5605830556594064952">Dvorak 美式鍵盤</translation> <translation id="5618330573454123917">此檔案是專為使用 Macintosh 軟件的電腦而設,與運行 Chrome OS 的裝置並不相容。<ph name="BEGIN_LINK_HELP" />進一步瞭解<ph name="END_LINK_HELP" />如何在 Chrome OS 中開啟檔案。</translation> @@ -841,7 +841,7 @@ <translation id="8128733386027980860">英文 (英國),Dvorak 鍵盤</translation> <translation id="8137331602592933310">「<ph name="FILENAME" />」是他人與您共用的項目。您不是這個檔案的擁有者,無法刪除這個檔案。</translation> <translation id="813913629614996137">正在初始化…</translation> -<translation id="8147028810663464959">字元為全形</translation> +<translation id="8147028810663464959">字元寬度為全形</translation> <translation id="8151638057146502721">設定</translation> <translation id="8154842056504218462">揀晒所有項目。</translation> <translation id="8157684860301034423">無法擷取應用程式資料。</translation>
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js index be6b698..0ef796cb 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -1649,27 +1649,11 @@ })(); /** - * Opens the send feedback window with pre-populated content. + * Opens the send feedback window. */ CommandHandler.COMMANDS_['send-feedback'] = new (class extends FilesCommand { execute(event, fileManager) { - const message = { - categoryTag: 'chromeos-files-app', - requestFeedback: true, - feedbackInfo: { - description: '', - }, - }; - - const kFeedbackExtensionId = 'gfdkimpbcpahaombhbimeihdjnejgicl'; - // On ChromiumOS the feedback extension is not installed, so we just log - // that filing feedback has failed. - chrome.runtime.sendMessage(kFeedbackExtensionId, message, (response) => { - if (chrome.runtime.lastError) { - console.log( - 'Failed to send feedback: ' + chrome.runtime.lastError.message); - } - }); + chrome.fileManagerPrivate.sendFeedback(); } })();
diff --git a/ui/file_manager/integration_tests/file_manager/gear_menu.js b/ui/file_manager/integration_tests/file_manager/gear_menu.js index 181c2cf..3a24300 100644 --- a/ui/file_manager/integration_tests/file_manager/gear_menu.js +++ b/ui/file_manager/integration_tests/file_manager/gear_menu.js
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {addEntries, ENTRIES, RootPath, sendTestMessage, TestEntryInfo} from '../test_util.js'; +import {addEntries, ENTRIES, getCaller, pending, repeatUntil, RootPath, sendTestMessage, TestEntryInfo} from '../test_util.js'; import {testcase} from '../testcase.js'; -import {isSinglePartitionFormat, navigateWithDirectoryTree, openNewWindow, remoteCall, setupAndWaitUntilReady} from './background.js'; +import {navigateWithDirectoryTree, openNewWindow, remoteCall, setupAndWaitUntilReady} from './background.js'; import {BASIC_ANDROID_ENTRY_SET, BASIC_ANDROID_ENTRY_SET_WITH_HIDDEN, BASIC_DRIVE_ENTRY_SET, BASIC_DRIVE_ENTRY_SET_WITH_HIDDEN, BASIC_LOCAL_ENTRY_SET, BASIC_LOCAL_ENTRY_SET_WITH_HIDDEN, COMPLEX_DOCUMENTS_PROVIDER_ENTRY_SET} from './test_data.js'; /** @@ -413,10 +413,11 @@ }; /** - * Tests that Send feedback appears in the gear menu. + * Tests that the "Send feedback" button appears in the gear menu and properly + * opens the feedback window. */ testcase.showSendFeedbackAction = async () => { - const entrySet = [ENTRIES.newlyAdded]; + const feedbackWindowUrl = 'chrome://feedback/'; // Open Files.App on Downloads. const appId = await openNewWindow(RootPath.DOWNLOADS); @@ -432,12 +433,23 @@ // Wait for the gear menu to appear. await remoteCall.waitForElement(appId, '#gear-menu:not([hidden])'); - // Check #send-feedback is shown and it's enabled. - await remoteCall.waitForElement( + // Check that there is no feedback window opened. + chrome.test.assertFalse(await remoteCall.windowUrlExists(feedbackWindowUrl)); + + // Click #send-feedback, which should be shown and enabled. + await remoteCall.waitAndClickElement( appId, '#gear-menu:not([hidden]) cr-menu-item' + '[command=\'#send-feedback\']' + ':not([disabled]):not([hidden])'); + + // Check that the feedback window is open. + const caller = getCaller(); + return repeatUntil(async () => { + if (!await remoteCall.windowUrlExists(feedbackWindowUrl)) { + return pending(caller, `Waiting for ${feedbackWindowUrl} to open`); + } + }); }; /**
diff --git a/ui/file_manager/integration_tests/file_manager/office.js b/ui/file_manager/integration_tests/file_manager/office.js index 966a064..4a4d3ff 100644 --- a/ui/file_manager/integration_tests/file_manager/office.js +++ b/ui/file_manager/integration_tests/file_manager/office.js
@@ -149,7 +149,7 @@ // Check that the Word file's alternate URL has been opened in a browser // window. - await remoteCall.waitForActiveBrowserTabUrl( + await remoteCall.waitForLastOpenedBrowserTabUrl( ENTRIES.smallDocxHosted.alternateUrl); // Assert that a UMA sample has been reported for executing Web Drive Office
diff --git a/ui/file_manager/integration_tests/remote_call.js b/ui/file_manager/integration_tests/remote_call.js index c234d2e2..fa64b0d 100644 --- a/ui/file_manager/integration_tests/remote_call.js +++ b/ui/file_manager/integration_tests/remote_call.js
@@ -592,25 +592,37 @@ } /** - * Waits until the browser is opened and shows the expected URL. - * @param {string} expectedURL + * Waits until the expected URL shows in the last opened browser tab. + * @param {string} expectedUrl * @return {!Promise} Promise to be fulfilled when the expected URL is shown * in a browser window. */ - async waitForActiveBrowserTabUrl(expectedURL) { + async waitForLastOpenedBrowserTabUrl(expectedUrl) { const caller = getCaller(); return repeatUntil(async () => { - const command = {name: 'getActiveTabURL'}; - const activeWindowURL = await sendTestMessage(command); - if (activeWindowURL !== expectedURL) { + const command = {name: 'getLastActiveTabURL'}; + const activeBrowserTabURL = await sendTestMessage(command); + if (activeBrowserTabURL !== expectedUrl) { return pending( caller, 'waitForActiveBrowserTabUrl: expected %j actual %j.', - expectedURL, activeWindowURL); + expectedUrl, activeBrowserTabURL); } }); } /** + * Returns whether an window exists with the expected URL. + * @param {string} expectedUrl + * @return {!Promise<boolean>} Promise resolved with true or false depending + * on whether such window exists. + */ + async windowUrlExists(expectedUrl) { + const command = {name: 'expectWindowURL', expectedUrl: expectedUrl}; + const windowExists = await sendTestMessage(command); + return windowExists == 'true'; + } + + /** * Waits for the file list turns to the given contents. * @param {string} appId App window Id. * @param {Array<Array<string>>} expected Expected contents of file list.
diff --git a/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc b/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc index 3a7d04d..af847e8 100644 --- a/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc +++ b/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc
@@ -67,9 +67,11 @@ void ShellPopupWrapper::GrabIfPossible(WaylandConnection* connection, WaylandWindow* parent_window) { +#if !BUILDFLAG(IS_CHROMEOS_LACROS) base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); if (!cmd_line->HasSwitch(switches::kUseWaylandExplicitGrab)) return; +#endif // !BUILDFLAG(IS_CHROMEOS_LACROS) // When drag process starts, as described the protocol - // https://goo.gl/1Mskq3, the client must have an active implicit grab. If
diff --git a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc index 1385c3c3..699b82d7 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -2911,12 +2911,19 @@ auto* test_popup = GetTestXdgPopupByWindow(popup.get()); ASSERT_TRUE(test_popup); + +#if !BUILDFLAG(IS_CHROMEOS_LACROS) if (use_explicit_grab) { EXPECT_NE(test_popup->grab_serial(), button_release_serial); EXPECT_EQ(test_popup->grab_serial(), button_press_serial); } else { EXPECT_EQ(test_popup->grab_serial(), 0U); } +#else + // crbug.com/1320528: Lacros uses explicit grab always. + EXPECT_NE(test_popup->grab_serial(), button_release_serial); + EXPECT_EQ(test_popup->grab_serial(), button_press_serial); +#endif // !BUILDFLAG(IS_CHROMEOS_LACROS) } } @@ -2969,11 +2976,14 @@ auto* test_popup = GetTestXdgPopupByWindow(popup.get()); ASSERT_TRUE(test_popup); + // crbug.com/1320528: Lacros uses explicit grab always. +#if !BUILDFLAG(IS_CHROMEOS_LACROS) // Unless the use-wayland-explicit-grab switch is set, touch events are the // exception, i.e: the serial sent before the "up" event (latest) cannot be // used, otherwise, some compositors may dismiss popups. if (!use_explicit_grab) EXPECT_EQ(test_popup->grab_serial(), 0U); +#endif popup->Hide(); @@ -2991,20 +3001,23 @@ test_popup = GetTestXdgPopupByWindow(popup.get()); ASSERT_TRUE(test_popup); - uint32_t expected_serial = touch_down_serial; #if !BUILDFLAG(IS_CHROMEOS_LACROS) + uint32_t expected_serial = touch_down_serial; auto env = base::Environment::Create(); if (base::nix::GetDesktopEnvironment(env.get()) == base::nix::DESKTOP_ENVIRONMENT_GNOME) { // We do not grab with touch events on gnome shell. expected_serial = 0u; } -#endif // !BUILDFLAG(IS_CHROMEOS_LACROS) if (use_explicit_grab) { EXPECT_EQ(test_popup->grab_serial(), expected_serial); } else { EXPECT_EQ(test_popup->grab_serial(), 0U); } +#else + // crbug.com/1320528: Lacros uses explicit grab always. + EXPECT_EQ(test_popup->grab_serial(), touch_down_serial); +#endif // !BUILDFLAG(IS_CHROMEOS_LACROS) } }
diff --git a/ui/views/animation/widget_fade_animator.cc b/ui/views/animation/widget_fade_animator.cc index f86d878..6977b5a 100644 --- a/ui/views/animation/widget_fade_animator.cc +++ b/ui/views/animation/widget_fade_animator.cc
@@ -31,6 +31,14 @@ fade_animation_.Start(); } +void WidgetFadeAnimator::CancelFadeIn() { + if (!IsFadingIn()) + return; + + fade_animation_.Stop(); + animation_type_ = FadeType::kNone; +} + void WidgetFadeAnimator::FadeOut() { if (IsFadingOut() || !widget_) return;
diff --git a/ui/views/animation/widget_fade_animator.h b/ui/views/animation/widget_fade_animator.h index 51ed81d..e7e81d7 100644 --- a/ui/views/animation/widget_fade_animator.h +++ b/ui/views/animation/widget_fade_animator.h
@@ -76,6 +76,12 @@ // will be made visible. void FadeIn(); + // Cancels any pending fade-in, leaves the widget at the current opacity to + // avoid abrupt visual changes. CancelFadeIn() should be followed with + // something, either another FadeIn(), or widget closing. It has no effect + // if the widget is not fading in. + void CancelFadeIn(); + // Plays the fade-out animation. At the end of the fade, the widget will be // hidden or closed, as per |close_on_hide|. If the widget is already hidden // or closed, completes immediately.
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc index d104924..539f2d1 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc
@@ -309,10 +309,9 @@ base::TimeTicks::Now(), flags, flag); } - ui::GestureEvent* GenerateGestureEvent(ui::EventType event_type, - const gfx::Point& gesture_location) { - ui::GestureEventDetails gesture_details(event_type); - gesture_details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN); + ui::GestureEvent* GenerateGestureEvent( + const gfx::Point& gesture_location, + const ui::GestureEventDetails& gesture_details) { return new ui::GestureEvent(gesture_location.x(), gesture_location.y(), 0, base::TimeTicks::Now(), gesture_details); } @@ -398,8 +397,9 @@ // |hittest| value we specified. if (use_touch_event) { - DispatchEvent(GenerateGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, - pointer_location_in_px)); + ui::GestureEventDetails gesture_details(ui::ET_GESTURE_SCROLL_BEGIN); + DispatchEvent( + GenerateGestureEvent(pointer_location_in_px, gesture_details)); } else { DispatchEvent(GenerateMouseEvent(ui::ET_MOUSE_PRESSED, pointer_location_in_px, @@ -418,8 +418,9 @@ // Dispatch mouse/touch release event to release a mouse/touch pressed // handler and be able to consume future events. if (use_touch_event) { - DispatchEvent(GenerateGestureEvent(ui::ET_GESTURE_SCROLL_END, - pointer_location_in_px)); + ui::GestureEventDetails gesture_details(ui::ET_GESTURE_SCROLL_END); + DispatchEvent( + GenerateGestureEvent(pointer_location_in_px, gesture_details)); } else { DispatchEvent(GenerateMouseEvent(ui::ET_MOUSE_RELEASED, pointer_location_in_px, @@ -431,33 +432,43 @@ // Tests that the window is maximized in response to a double click event. TEST_F(DesktopWindowTreeHostPlatformImplTest, DoubleClickHeaderMaximizes) { - gfx::Rect bounds(0, 0, 100, 100); - std::unique_ptr<Widget> widget(BuildTopLevelDesktopWidget(bounds)); - widget->Show(); + for (int use_touch_event = 0; use_touch_event < 2; use_touch_event++) { + gfx::Rect bounds(0, 0, 100, 100); + std::unique_ptr<Widget> widget(BuildTopLevelDesktopWidget(bounds)); + widget->Show(); - aura::Window* window = widget->GetNativeWindow(); - window->SetProperty(aura::client::kResizeBehaviorKey, - aura::client::kResizeBehaviorCanMaximize); + aura::Window* window = widget->GetNativeWindow(); + window->SetProperty(aura::client::kResizeBehaviorKey, + aura::client::kResizeBehaviorCanMaximize); - RunPendingMessages(); + RunPendingMessages(); - host_->ResetCalledMaximize(); + host_->ResetCalledMaximize(); - auto* frame_view = delegate_->frame_view(); - // Set the desired hit test result value, which will be returned, when - // WindowEventFilter starts to perform hit testing. - frame_view->set_hit_test_result(HTCAPTION); + auto* frame_view = delegate_->frame_view(); + // Set the desired hit test result value, which will be returned, when + // WindowEventFilter starts to perform hit testing. + frame_view->set_hit_test_result(HTCAPTION); - host_->ResetCalledMaximize(); + host_->ResetCalledMaximize(); - int flags = ui::EF_LEFT_MOUSE_BUTTON; - GenerateAndDispatchClickMouseEvent(gfx::Point(), flags); - flags |= ui::EF_IS_DOUBLE_CLICK; - GenerateAndDispatchClickMouseEvent(gfx::Point(), flags); + if (use_touch_event) { + ui::GestureEventDetails details(ui::ET_GESTURE_TAP); + details.set_tap_count(1); + DispatchEvent(GenerateGestureEvent(gfx::Point(), details)); + details.set_tap_count(2); + DispatchEvent(GenerateGestureEvent(gfx::Point(), details)); + } else { + int flags = ui::EF_LEFT_MOUSE_BUTTON; + GenerateAndDispatchClickMouseEvent(gfx::Point(), flags); + flags |= ui::EF_IS_DOUBLE_CLICK; + GenerateAndDispatchClickMouseEvent(gfx::Point(), flags); + } - EXPECT_TRUE(host_->called_maximize()); + EXPECT_TRUE(host_->called_maximize()); - widget->CloseNow(); + widget->CloseNow(); + } } // Tests that the window does not maximize in response to a double click event, @@ -465,31 +476,44 @@ // second click. TEST_F(DesktopWindowTreeHostPlatformImplTest, DoubleClickTwoDifferentTargetsDoesntMaximizes) { - gfx::Rect bounds(0, 0, 100, 100); - std::unique_ptr<Widget> widget(BuildTopLevelDesktopWidget(bounds)); - widget->Show(); + for (int use_touch_event = 0; use_touch_event < 2; use_touch_event++) { + gfx::Rect bounds(0, 0, 100, 100); + std::unique_ptr<Widget> widget(BuildTopLevelDesktopWidget(bounds)); + widget->Show(); - aura::Window* window = widget->GetNativeWindow(); - window->SetProperty(aura::client::kResizeBehaviorKey, - aura::client::kResizeBehaviorCanMaximize); + aura::Window* window = widget->GetNativeWindow(); + window->SetProperty(aura::client::kResizeBehaviorKey, + aura::client::kResizeBehaviorCanMaximize); - RunPendingMessages(); + RunPendingMessages(); - host_->ResetCalledMaximize(); + host_->ResetCalledMaximize(); - auto* frame_view = delegate_->frame_view(); + auto* frame_view = delegate_->frame_view(); - frame_view->set_hit_test_result(HTCLIENT); - int flags = ui::EF_LEFT_MOUSE_BUTTON; - GenerateAndDispatchClickMouseEvent(gfx::Point(), flags); + if (use_touch_event) { + frame_view->set_hit_test_result(HTCLIENT); + ui::GestureEventDetails details(ui::ET_GESTURE_TAP); + details.set_tap_count(1); + DispatchEvent(GenerateGestureEvent(gfx::Point(), details)); - frame_view->set_hit_test_result(HTCLIENT); - flags |= ui::EF_IS_DOUBLE_CLICK; - GenerateAndDispatchClickMouseEvent(gfx::Point(), flags); + frame_view->set_hit_test_result(HTCLIENT); + details.set_tap_count(2); + DispatchEvent(GenerateGestureEvent(gfx::Point(), details)); + } else { + frame_view->set_hit_test_result(HTCLIENT); + int flags = ui::EF_LEFT_MOUSE_BUTTON; + GenerateAndDispatchClickMouseEvent(gfx::Point(), flags); - EXPECT_FALSE(host_->called_maximize()); + frame_view->set_hit_test_result(HTCLIENT); + flags |= ui::EF_IS_DOUBLE_CLICK; + GenerateAndDispatchClickMouseEvent(gfx::Point(), flags); + } - widget->CloseNow(); + EXPECT_FALSE(host_->called_maximize()); + + widget->CloseNow(); + } } // Tests that the window does not maximize in response to a double click event,
diff --git a/ui/views/widget/desktop_aura/window_event_filter_lacros.cc b/ui/views/widget/desktop_aura/window_event_filter_lacros.cc index a4401c9d..abdb31a 100644 --- a/ui/views/widget/desktop_aura/window_event_filter_lacros.cc +++ b/ui/views/widget/desktop_aura/window_event_filter_lacros.cc
@@ -34,7 +34,7 @@ return; } - aura::Window* window = static_cast<aura::Window*>(event->target()); + auto* window = static_cast<aura::Window*>(event->target()); int component = window->delegate() ? window->delegate()->GetNonClientComponent(event->location()) @@ -42,11 +42,7 @@ if (event->flags() & ui::EF_IS_DOUBLE_CLICK) { if (previous_pressed_component_ == HTCAPTION && component == HTCAPTION) { - // TODO(crbug.com/1299310): send toggle event to ash-chrome. - if (window->GetProperty(aura::client::kResizeBehaviorKey) & - aura::client::kResizeBehaviorCanMaximize) { - ToggleMaximizedState(); - } + MaybeToggleMaximizedState(window); previous_pressed_component_ = HTNOWHERE; event->SetHandled(); } @@ -57,17 +53,39 @@ } void WindowEventFilterLacros::OnGestureEvent(ui::GestureEvent* event) { - aura::Window* window = static_cast<aura::Window*>(event->target()); + auto* window = static_cast<aura::Window*>(event->target()); int component = window->delegate() ? window->delegate()->GetNonClientComponent(event->location()) : HTNOWHERE; + // Double tap to maximize. + if (event->type() == ui::ET_GESTURE_TAP) { + int previous_pressed_component = previous_pressed_component_; + previous_pressed_component_ = component; + + if (previous_pressed_component_ == HTCAPTION && + previous_pressed_component == HTCAPTION && + event->details().tap_count() == 2) { + MaybeToggleMaximizedState(window); + previous_pressed_component_ = HTNOWHERE; + event->SetHandled(); + } + return; + } + + // Interactive window move. if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) MaybeDispatchHostWindowDragMovement(component, event); } -void WindowEventFilterLacros::ToggleMaximizedState() { +void WindowEventFilterLacros::MaybeToggleMaximizedState(aura::Window* window) { + if (!(window->GetProperty(aura::client::kResizeBehaviorKey) & + aura::client::kResizeBehaviorCanMaximize)) { + return; + } + + // TODO(crbug.com/1299310): send toggle event to ash-chrome. if (desktop_window_tree_host_->IsMaximized()) desktop_window_tree_host_->Restore(); else
diff --git a/ui/views/widget/desktop_aura/window_event_filter_lacros.h b/ui/views/widget/desktop_aura/window_event_filter_lacros.h index 4b9edde..3644293 100644 --- a/ui/views/widget/desktop_aura/window_event_filter_lacros.h +++ b/ui/views/widget/desktop_aura/window_event_filter_lacros.h
@@ -9,6 +9,10 @@ #include "ui/events/event_handler.h" #include "ui/views/views_export.h" +namespace aura { +class Window; +} // namespace aura + namespace ui { class GestureEvent; class MouseEvent; @@ -37,7 +41,7 @@ void OnMouseEvent(ui::MouseEvent* event) override; private: - void ToggleMaximizedState(); + void MaybeToggleMaximizedState(aura::Window* window); // Dispatches a message to the window manager to tell it to act as if a border // or titlebar drag occurred with left mouse click. In case of X11, a
diff --git a/ui/views/widget/desktop_aura/window_event_filter_linux.cc b/ui/views/widget/desktop_aura/window_event_filter_linux.cc index 87109abc..ed48c4c 100644 --- a/ui/views/widget/desktop_aura/window_event_filter_linux.cc +++ b/ui/views/widget/desktop_aura/window_event_filter_linux.cc
@@ -115,11 +115,7 @@ event->SetHandled(); break; case LinuxUI::WindowFrameAction::kToggleMaximize: - - if (content_window->GetProperty(aura::client::kResizeBehaviorKey) & - aura::client::kResizeBehaviorCanMaximize) { - ToggleMaximizedState(); - } + MaybeToggleMaximizedState(content_window); event->SetHandled(); break; case LinuxUI::WindowFrameAction::kMenu: @@ -165,7 +161,12 @@ } } -void WindowEventFilterLinux::ToggleMaximizedState() { +void WindowEventFilterLinux::MaybeToggleMaximizedState(aura::Window* window) { + if (!(window->GetProperty(aura::client::kResizeBehaviorKey) & + aura::client::kResizeBehaviorCanMaximize)) { + return; + } + if (desktop_window_tree_host_->IsMaximized()) desktop_window_tree_host_->Restore(); else @@ -214,12 +215,24 @@ ? window->delegate()->GetNonClientComponent(event->location()) : HTNOWHERE; + // Double tap to maximize. + if (event->type() == ui::ET_GESTURE_TAP) { + int previous_click_component = click_component_; + click_component_ = hit_test_code; + + if (click_component_ == HTCAPTION && + click_component_ == previous_click_component && + event->details().tap_count() == 2) { + MaybeToggleMaximizedState(window); + click_component_ = HTNOWHERE; + event->StopPropagation(); + } + return; + } + // Interactive window move. if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) MaybeDispatchHostWindowDragMovement(hit_test_code, event); - - // TODO(https://crbug.com/1282318): Add support to other gestures, - // including double-tap-to-maximize. } } // namespace views
diff --git a/ui/views/widget/desktop_aura/window_event_filter_linux.h b/ui/views/widget/desktop_aura/window_event_filter_linux.h index d126f9e..8d617e4 100644 --- a/ui/views/widget/desktop_aura/window_event_filter_linux.h +++ b/ui/views/widget/desktop_aura/window_event_filter_linux.h
@@ -9,6 +9,10 @@ #include "ui/events/event_handler.h" #include "ui/views/views_export.h" +namespace aura { +class Window; +} // namespace aura + namespace ui { class LocatedEvent; class MouseEvent; @@ -43,7 +47,7 @@ // Called when the user clicked the maximize button. void OnClickedMaximizeButton(ui::MouseEvent* event); - void ToggleMaximizedState(); + void MaybeToggleMaximizedState(aura::Window* window); // Dispatches a message to the window manager to tell it to act as if a border // or titlebar drag occurred with left mouse click. In case of X11, a